【发布时间】:2014-08-25 22:00:25
【问题描述】:
首先,这不是关于如何在 Java 中实现接口的问题,也不是关于接口错误的问题。这是一个关于正确方法的问题,视情况而定。
首先,如果这不是发布此问题的正确“堆栈”,我想道歉,请告诉我,我会将其移至另一个。
让我们开始吧。
我想猜测的是,在 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 **/
}
}
优点:
- 您可以保留对对象 MyListenerImplementation 的引用。
- 您可以定义变量、函数和一切,因为它是一个像任何其他对象一样的对象。
- 更清洁的代码。
缺点:
- 可能需要更多内存。
- 可能会创建不必要的类
C) 持有一个引用接口实现的变量
private MyListener.FooListener myListenerVar = new MyListener.FooListener() {
/** Logic goes here **/
};
优点:
- 我实际上看不到任何人与 B 相比,但有很多缺点。
缺点:
- 不是一个干净的代码。至少在课堂上这样做会构成战争罪。
- 我认为将代码块分配给变量是不正确的。
- 我不喜欢这个样子 ;)
D) 我能想到的最后一个;定义一个函数并在里面返回实现
private MyListener.fooListener createMyListener() {
return new MyListener.fooListener() {
/** Logic goes here **/
}
}
优点:
- 它比 C 更干净。
- 可重用性
缺点:
- 几乎和 C 一样。
- 我认为返回整个代码块是不正确的。
总结:我最喜欢的是“B”,但我想知道SO对此有何看法。
感谢您的建议。
【问题讨论】:
-
我很好奇,如果您对每个选项都有如此详细的优缺点列表,那么您在决定哪个选项最适合您时遇到问题呢?我怀疑是否有适合所有情况的答案。
-
我错了还是错过了什么。我认为 A、C 和 D 不会编译。还是只是“伪”-Java?
-
@EdwinDalorzo 正如你所说,每个选项都有优点和缺点,我正在尝试找出哪个是最好的。下面的解决方案和你说的一样,没有单一的方法可以做到这一点,这取决于情况和你想要做什么、代码可重用性、类长度等......
-
@Fildor 实际上它没有经过测试 Java 代码,它应该可以编译,但也许它不会。 A) 在something.setFooListener() 的括号内。我相信 C 和 D 会编译,因为它只是一个变量,函数声明和语法是正确的,但也许我遗漏了一些东西。无论如何,这不是问题的重点。
标签: java oop interface correctness