java - 接口(interface)实现之间的用例

标签 java interface callback anonymous-class

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

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

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

    大多数时候我都以这种方式使用接口(interface),如果接口(interface)是这样的契约:

    MyInterface foo = new MyClass();   
    

    现在我可以使用接口(interface)提供的方法来控制 MyClass。 这也非常适合 Collection 。如果有一些类实现 MyInterface 我有一个共同的线程:

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

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

    我使用这种方法进行带有依赖注入(inject)的回调,如下所示:

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

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

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

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

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

最佳答案

选择使用命名接口(interface)实现还是匿名接口(interface)实现取决于几个因素:

  • 您打算在实现中重用某些逻辑吗? - 如果答案是"is",则使用第一种方法;否则,使用第二种方法。
  • 您是否需要通过大量外部交互来实现复杂的逻辑? - 如果答案是"is",请使用第一种方法;否则,使用第二种方法。
  • 您的接口(interface)是否有多个方法,其中一些方法可能什么都不做? - 如果答案是"is",请使用第一种方法,或者创建一个“默认”类,其中所有实现都不执行任何操作;否则,使用第二种方法。

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

关于java - 接口(interface)实现之间的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981579/

相关文章:

java - 避免MVVM模式中的循环

c# - 如何通过接口(interface)继承在C#中重新定义一个属性?

java - 将对象的引用传递给 null JAVA 后使用接口(interface)

android - 在安卓 : How to Call Function of Activity from a Service?

perl - 如何使用哈希在 Perl 中创建回调函数(调度表)?

java - 长轮询卡住浏览器并阻止其他 ajax 请求

Java+线程控制方法

java - 循环遍历包含字符串和另一个映射的映射

c# - 接口(interface)隔离和单一职责原则的困境

javascript - ajax 调用如何将数据返回给变量?