【问题标题】:android interface make callback function optionalandroid接口使回调函数可选
【发布时间】:2015-10-07 16:42:03
【问题描述】:

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

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()。

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

【问题讨论】:

    标签: android interface callback


    【解决方案1】:

    听起来您真的在考虑将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();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      public interface InterfaceName {
          default void function1(){ /* do nothing */}
          default void function2(){ /* do nothing */}
      }
      

      因此,您可以避免实现这些方法,因为您提供的是默认实现。在我的示例中,默认设置是什么都不做,当然,您可以对它们进行个性化设置。

      【讨论】:

      • 由于我使用的是android studio,是依赖系统上安装的java版本还是有自己的包?
      • Java 8 太棒了!遗憾的是,这个问题被标记为 Android,它还不支持 Java 8 功能。
      • 这取决于您使用的 SDK Java 版本。因此,如果您使用 Android,我想您使用的是 JDK 7。
      • @user1217974 Android 支持 Java 7 语言功能,但不支持 Java 8。某些功能可以通过 3rd 方工具实现,但我不相信这个特定功能已被向后移植。
      • 是的!无论如何,它现在确实如此。 @GVillani82 你能更新你的答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2015-02-15
      • 2015-02-05
      • 2011-10-08
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多