我知道两种使用接口(interface)的方法。
public interface MyInterface {
void myMethod();
}
方法:使用
实现
:public class MyClass implements MyInterface { @Override myMethod(){} }
大多数时候我都以这种方式使用接口(interface),如果接口(interface)是这样的契约:
MyInterface foo = new MyClass();
现在我可以使用接口(interface)提供的方法来控制 MyClass。 这也非常适合 Collection 。如果有一些类实现
MyInterface
我有一个共同的线程:List<MyInterface> list = new ArrayList<MyInterface>();
方法:将其用作
匿名类
: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/