1

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

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

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

    如果接口是类似的合同,我大部分时间都以这种方式使用接口:

    MyInterface foo = new MyClass();   
    

    现在我可以使用提供的接口方法来控制 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;
        }
    }
    

    MyOtherClassmyInterface.myMethod()在适当的地方调用。

第一种方法可以通过使用 the this pointertoo 来实现回调。现在我想知道回调应该使用哪种方法,为什么?我都见过,但我不知道真正的好处在哪里。

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

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

4

1 回答 1

1

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

  • 您是否打算在实现中重用一些逻辑?- 如果答案是“是”,则使用第一种方法;否则,使用第二种方法。
  • 您是否需要通过大量外部交互来实现复杂的逻辑?- 如果答案是“是”,则使用第一种方法;否则,使用第二种方法。
  • 您的界面是否有多个方法,其中一些可能没有任何意义?- 如果答案是“是”,则使用第一种方法,或者创建一个“默认”类,所有实现什么都不做;否则,使用第二种方法。

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

于 2013-11-14T15:38:07.430 回答