假设我有这个界面:
public interface MyInterface {
static MyInterface getSingleton() {
return MyDefaultImplementation.getSingleton();
}
//declare some methods
}
这个类:
final class MyDefaultImplementation implements MyInterface {
private static final MyInterface mySingleton = new MyDefaultImplementation();
static final MyInterface getInstance() {
return mySingleton();
}
private MyDefaultImplementation() {
//...
}
//implement interface methods
}
我想知道 MyInterface 的 getSingleton() 方法是否应该存在,或者将 MyDefaultImplementation 及其 getInstance 方法公开是否更正确。确实如此,那么在接口(interface)中使用 getSingleton 方法的主要场景是什么?
感谢您的宝贵时间
最佳答案
接口(interface)的要点是避免使用该接口(interface)的“客户端”代码了解该类的实现细节。这对于 future 的维护至关重要,因为您正在设计能够在未来某个时间点替换接口(interface)实现的能力。
如果您的接口(interface)包含如何“获取”底层实现的引用,那么为了更新您的代码,您现在需要重写您的接口(interface)并重新部署它。这种基于实现更改的接口(interface)“更改”,而不是“接口(interface)”更改(添加或删除方法)强烈意味着您没有按照系统设计的初衷进行工作。
默认方法是 Java 中相对较新的补充。过去没有添加它们,因为没有它们,就不可能将实现组合到接口(interface)中。它们的添加允许在接口(interface)中定义实现的许多场景,这模糊了接口(interface)和抽象类之间的界限。在我看来,这剥夺了界面的实用性。
最后,您将使用它来创建一个Singleton
,这表明您正在面向对象的系统中使用前面向对象的设计实践。单例是引入无作用域全局变量的方法。无作用域全局变量使得 C/C++ 程序非常难以维护。您最好将代码对齐到传递到需要它的方法中的对象中。如果您只需要该对象的一个实例,则改进的代码结构可以只创建一个实例(一次调用 new),并且哪些方法使用该对象、哪些方法不使用该对象将一目了然。
关于java - 在接口(interface)中使用静态单例 getter 是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45997326/