首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android接口可选回调函数

问android接口可选回调函数
EN

Stack Overflow用户
提问于 2015-07-18 05:01:41
回答 2查看 4.6K关注 0票数 1

我有一个简单的类,启用了一个接口,并且在使用时可以正常工作。

代码语言:javascript
复制
interface interfacename{
   void function1();
   void function2();
}


public class asyncfunction(){
   public interfacename listener;
   ...
   onasyncStart( ... ){
        listener.function1();
   }
   ...
   ...
   onasyncComplete( ... ){
        listener.function2();
   }
}

public myclass(){
   ....
   ....
   methodcall(new interfacename(){
       @Override
       public void function1(){
          // executes proper
       }

       @Override
       public void function2(){
          // executes proper
       }
   }
}

因此,上面的方法可以正常工作。

但我有时只想调用function1(),并且只想在需要的时候调用function2()。

我不希望同时实现这两种方法。代码看起来很大,我不确定它是否会减慢代码的速度(不是在毫秒级的btw上),但如果有另一种方法可以在需要时执行特定的回调,那就太好了。

EN

回答 2

Stack Overflow用户

发布于 2015-07-18 05:26:37

听起来你真的想把你的interface拆分成多个接口,然后改变接受这个interface作为参数的方法,这样它就会接受它所需要的interface (比如InterfaceOne)来调用这个interface中的方法(比如function1())。另一个方法可能希望调用function2(),在这种情况下,它将接受InterfaceTwo类型的参数。

但是,如果您需要始终在方法中调用interface的两个方法,但并不总是需要在该interface的方法中调用任何代码,那么您将看到以下内容。

您可以使用具有空方法主体的基类,并简单地覆盖所需的方法主体,而不是创建类型为interfacename的新匿名类。抽象基类实现的方法本质上是可选的,而那些未实现的方法是必需的方法。

这是Java开发中非常常见的模式。

代码语言:javascript
复制
public interface InterfaceName {

    void function1();
    void function2();

}

public abstract class BaseInterfaceName implements InterfaceName {

    public void function1() {
    }

    public void function2() {
    }

}

public class MyClass {

    public void myMethod() {
        myMethodWithInterface(new BaseInterfaceName() {
            @Override
            public void function2() {
                System.out.println("function2");
            }
        })
    }

    public void myMethodWithInterface(InterfaceName intf) {
        intf.function1();
        intf.function2();
    }

}
票数 5
EN

Stack Overflow用户

发布于 2015-07-18 05:33:11

一个可能的解决方案是@Nicklas解释的那个。

但是,如果您使用Java8,则可以使用default method。所以你可以这样声明你的接口:

代码语言:javascript
复制
public interface InterfaceName {
    default void function1(){ /* do nothing */}
    default void function2(){ /* do nothing */}
}

因此,您可以避免实现这些方法,因为您提供的是默认实现。在我的示例中,默认设置是不执行任何操作,但当然,您也可以对它们进行个性化设置。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31484650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档