接口实现之间的用例

时间:2013-11-14 15:25:26

标签: java interface callback anonymous-class

我知道使用接口的两种方法。

public interface MyInterface {
    void myMethod();
}
  1. 方法:使用implements

    public class MyClass implements MyInterface {
    
        @Override
        myMethod(){}
    
    }
    

    如果接口是如下的合同,我大部分时间都在使用这种接口:

    MyInterface foo = new MyClass();   
    

    现在我可以使用提供的Interface方法控制MyClass。 这对收藏也很好。如果有一些类实现MyInterface我有一个共同的线程:

    List<MyInterface> list = new ArrayList<MyInterface>();
    
  2. 方法:将其用作anonymous class

    public class MyClass {
        public MyInterface myInterface = new MyInterface(){   
             @Override
             public void myMethod(){}            
        };
    }
    

    我正在使用这种方法进行具有依赖注入的回调,如下所示:

    public class MyOtherClass {
        public MyInterface myInterface;
    
        // Using setter injection here
        public void setInterface(MyInterface interface){
            myInterface = interface;
        }
    }
    

    MyOtherClass正在调用适当的myInterface.myMethod()

  3. 使用this pointer也可以通过第一种方法实现回调。现在我想知道哪种方法应该用于回调以及为什么?我已经看到了两者,我不知道真正的好处在哪里。

    我认为,这是我可以在第一种和第二种方法之间做出选择的唯一区别。如果我错了,请告诉我另一个不同之处。我要求它能够为不同的情况选择合适的工具。

    另外我想知道另一种情况,但是回调,我可以使用第二种方法。

1 个答案:

答案 0 :(得分:1)

使用命名或匿名接口实现的选择取决于以下几点:

  • 您是否计划在实施中重复使用某些逻辑? - 如果答案为“是”,请使用第一种方法;否则,请使用第二种方法。
  • 您是否需要通过大量外部交互来实现复杂逻辑? - 如果答案为“是”,请使用第一种方法;否则,请使用第二种方法。
  • 您的界面是否有多种方法,其中一些可能无意义地执行任何操作? - 如果答案为“是”,请使用第一种方法,或者制作一个“默认”类,所有实现都在执行没有;否则,请使用第二种方法。

最后,这两种方法之间的最大区别主要是非技术性的:它与您生成的代码的可读性有关。毕竟,匿名类只不过是“语法糖” - 你可以用只有命名的类来完美地实现你的系统。如果您认为命名实现更好,请使用第一种方法;如果您认为匿名的一个更好用,请使用第二种方法。