【问题标题】:Use cases between interface implementations接口实现之间的用例
【发布时间】:2013-11-14 15:25:25
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 它们是两个不同的东西。第一种方法使用继承,而第二种方法使用组合。选择哪一个取决于在您的接口和类的上下文中哪个更有意义。
  • @shyam 这正是我迷失的地方,找不到正确的上下文。

标签: java interface callback anonymous-class


【解决方案1】:

选择使用命名接口实现还是匿名接口实现取决于几件事:

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

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

【讨论】:

  • 总而言之,命名实现应该优先于可重用性?
  • @SteveBennett 有时,根本没有可重用性——例如,当你的类是一个简单的管道时,它提供“胶合逻辑”以将回调与一两个方法连接起来,执行“举重”。但是,如果您认为您正在编写的回调代码可以被重用,那么您绝对应该选择一个命名类。确定的一种方法是,如果您看到自己将代码从一个匿名类复制粘贴到另一个匿名类。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2016-10-04
  • 2014-03-12
  • 1970-01-01
  • 2014-02-07
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多