android接口使回调函数可选

use*_*974 1 android interface callback

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

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
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

所以上面的方法是正常的.

但我想有时只调用function1(),只需要调用function2().

我不想总是实现这两种方法.代码看起来很大,我不确定它是否会减慢代码速度(不是在毫秒级别btw)但是如果有另一种方法可以在需要时执行特定的回调,那将会非常好.

Nic*_*las 5

听起来你真的在考虑将你interface分成多个接口,并改变接受它interface作为参数的方法,这样它就会接受interface它需要的(例如InterfaceOne)以便在其中调用一个方法interface(例如function1()).另一种方法可能想要调用function2(),在这种情况下它将接受类型的参数InterfaceTwo.

但是,如果你需要总是调用方法中的两个方法interface,但是你并不总是需要调用方法中的任何代码interface,那么你所看到的是以下内容.

interfacename您可以使用具有空方法体的基类,而不是创建新的类型的匿名类,而只是覆盖您需要的类.抽象基类实现的方法本质上是可选的,而未实现的方法是必需的方法.

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

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();
    }

}
Run Code Online (Sandbox Code Playgroud)


GVi*_*i82 5

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

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

public interface InterfaceName {
    default void function1(){ /* do nothing */}
    default void function2(){ /* do nothing */}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,它确实!无论如何,现在确实如此。@GVillani82 你能更新你的答案吗? (2认同)