首先,这不是一个关于如何在 Java 中实现接口(interface)的问题,也不是关于接口(interface)错误的问题。这是一个关于根据具体情况采取正确方法的问题。
首先,如果这不是发布此问题的正确“堆栈”,我谨表示歉意,请告诉我,我会将其移至另一个堆栈。
让我们开始吧。
我试图猜测哪种是在 Java 中实现接口(interface)的最佳方式。假设我们有一个 A 类,如下所示:
public Class A {
public A(){}
public void fooA() {}
}
还有一个界面
public interface MyListener {
public void fooListener();
}
在 fooA()
中,我以这种方式使用接口(interface) B:
...
something.setFooListener(/**Doubts here**/)
....
我们应该在 setFooListener(...) 中输入什么
选项是(据我所知):
A) 定义 setFooListener 函数内的行为:
new MyListener.fooListener() {
/** Implementation of fooListener() **/
}
优点:
在阅读函数时简单易读。
您可以直接访问 fooA() 中定义的 FINAL 变量。
缺点:
- 如果您的实现足够长,最终会导致缺乏可读性和函数过长。
- 如果您在同一个类的几个地方实现该接口(interface),您将重复大量代码。
B) 创建一个实现接口(interface)的内部类:
private class MyListenerImplementation implements MyListener {
private String var1;
private int var2;
public MyListenerImplementation() {/** constructor **/}
public void fooListener() {
/** Do logic here **/
}
}
优点:
- 您可以保留对 MyListenerImplementation 对象的引用。
- 您可以定义变量、函数和所有内容,因为它与任何其他对象一样都是对象。
- 更简洁的代码。
缺点:
- 也许需要更多内存。
- 可能会创建不必要的类
C) 保存一个带有接口(interface)实现引用的变量
private MyListener.FooListener myListenerVar = new MyListener.FooListener() {
/** Logic goes here **/
};
优点:
- 我实际上看不出有人可以与 B 进行比较,但有很多缺点。
缺点:
- 不是干净的代码。在你的类(class)中这样做至少是一种 war 罪。
- 我认为将代码块分配给变量是不正确的。
- 我不喜欢这个样子;)
D)我能想到的最后一个;定义一个函数并在内部返回实现
private MyListener.fooListener createMyListener() {
return new MyListener.fooListener() {
/** Logic goes here **/
}
}
优点:
- 它比 C 更干净。
- 可重用性
缺点:
- 与 C 几乎相同。
- 我认为返回整个代码块是不正确的。
总结一下:我最喜欢的是“B”,但我想知道SO对此有何看法。
感谢您的建议。
最佳答案
选项 A 在语法上不正确。你的优点和缺点都是有效的。
选项B:
- 也许需要更多内存:不需要。
- 也许会创建不必要的类:不。选项 A 还创建一个类。它是匿名的,但它是一个类,必须像任何其他类一样由 ClassLoader 加载。
选项 C:它与 A(匿名类用法)完全相同,只不过您使用监听器初始化字段。该规则与任何其他变量相同:尽可能缩小其范围。如果您需要字段范围,请使用此选项。如果您只需要在一种方法中使用监听器,则使用局部变量(选项 A)。
选项 D:再次与 A 相同,只不过您返回创建的监听器而不是仅使用它。
我的回顾:您在这里混合了三个正交问题。
- 我应该使用匿名内部类、命名嵌套类还是顶级类。这取决于类中包含的代码量,以及需要在何处使用此类:在单个顶级类中,还是在许多顶级类中。
- 我应该使用局部变量还是实例变量?这是范围和状态的问题,而不是接口(interface)实现的问题。您的字段或局部变量可以使用任何类型的接口(interface)实现的实例进行初始化
- 您应该使用返回实例的工厂方法,还是应该直接使用
new
。再说一次,这与你的界面的实现方式无关。如果您想要松散耦合,因为工厂方法可能返回同一接口(interface)的不同实现,请使用工厂。否则,新的就可以了。
关于java - 我应该如何在Java中实现接口(interface)? [代码正确性],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487209/