java - 在接口(interface)中使用静态单例 getter 是一种不好的做法吗?

标签 java java-8 singleton

假设我有这个界面:

    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/

相关文章:

java - 是否需要安装mysql才能在另一台计算机本地保存和检索sql数据?

Java流图修改未内置类的自定义类对象

ios - Objective-C - 单例在应用程序重启后不保留数据

java - 是否可以将 persistence.xml 放在 META-INF 以外的位置?

java - ruby 在 Netty 中为 LengthFieldBasedFrameDecoder 参数构建一个文件

java - GWT 中的 DataGrid,无法清除它

Java 使用 void 方法进行流映射?

javascript - 在 Nashorn 中将 javascript 名称设置为 Java 函数

java - 单例设计模式 : Pitfalls

java - 将 Class<?> cls 作为方法参数传递?