首先,这不是关于如何在Java中实现接口或关于接口错误的问题。这是一个关于正确方法的问题,具体取决于具体情况。
首先,我想道歉,如果这不是正确的#34;堆栈"发布此问题,请告诉我,我会将其移至另一个。
让我们开始。
我想要猜测的是在Java中实现接口的最佳方式。我们假设我们有一个类A:
public Class A {
public A(){}
public void fooA() {}
}
和界面
public interface MyListener {
public void fooListener();
}
在fooA()
内部,我以这种方式使用界面B:
...
something.setFooListener(/**Doubts here**/)
....
我们应该在setFooListener(...)
中输入什么选项是(据我所知):
A)定义setFooListener函数内的行为:
new MyListener.fooListener() {
/** Implementation of fooListener() **/
}
优点:
在您阅读该功能时,简单易读。
您可以直接访问fooA()中定义的FINAL变量。
缺点:
B)创建一个实现接口的内部类:
private class MyListenerImplementation implements MyListener {
private String var1;
private int var2;
public MyListenerImplementation() {/** constructor **/}
public void fooListener() {
/** Do logic here **/
}
}
优点:
缺点:
C)保持变量并引用接口实现
private MyListener.FooListener myListenerVar = new MyListener.FooListener() {
/** Logic goes here **/
};
优点:
缺点:
private MyListener.fooListener createMyListener() {
return new MyListener.fooListener() {
/** Logic goes here **/
}
}
优点:
缺点:
总结一下:我最喜欢的是" B",但我想知道SO对此的看法。
感谢您的建议。
答案 0 :(得分:3)
选项A在语法上不正确。您的利弊是有效的。
选项B:
选项C:除了用监听器初始化字段外,它与A(匿名类使用)完全相同。该规则与任何其他变量相同:尽可能减少其范围。如果需要字段范围,请使用此选项。如果您只需要一个方法中的侦听器,那么请使用局部变量(选项A)。
选项D:再次,它与A相同,除了您返回创建的侦听器而不是仅使用它。
我的回顾:你在这里混合了三个正交问题。
new
。再次,这与您的界面的实现方式无关。如果要松散耦合,因为工厂方法可能返回同一接口的不同实现,请使用工厂。否则,新的就好了。