我们可以通过使用非私有instanceName来创建Singleton类吗?

时间:2016-06-02 18:17:28

标签: java design-patterns singleton

通常,我已经看到Singleton类中的实例变量保持私有。但是有可能将其保密吗? 如果我们声明这样的实例怎么办: -

final static SingletonClass singletonInstance= new SingletonClass(); 

这会导致该类成为有效的Singleton类吗?

3 个答案:

答案 0 :(得分:1)

singleton pattern确保在任何给定时间都是系统中该类的单个实例。这种模式并没有说公共/私人

只要您有一个可用的实例,实现就会有所不同。

在您的情况下,如果所有构造函数都是私有的,并且其余类将能够访问像SingletonClass.singletonInstance这样的单例,那么将满足单例模式。

答案 1 :(得分:1)

我们将实例变量设为私有,因为我们希望对它进行完全控制(在您的情况下,您将其设置为final和static,因此在任何人可以使用之前,它具有值,之后无法更改)。

但有几点反对它:

1)如果变量是私有的而不是静态的,通常的单例设计不会初始化变量,直到我们想要使用它(延迟加载)。

2)我们应该尽可能地减少变量/函数的范围。如果您不希望任何人直接更改它,请不要公开它(更好的设计)

只有我能看到的另一点是你不必担心线程安全(如果你有多线程应用程序,通常单独使用你需要注意它)

答案 2 :(得分:0)

唯一可见的差异取决于JVM如何处理自身。 这样做,有可能在访问它之前分配了类。这可能不是现在或者永远都没有,但这会产生对语言实现的依赖,而经典的方法将初始化留在第一个调用者手中

EDIT1:

从技术上讲,它仍然是一个有效的Singleton类,只要JVM在这种访问方案中确保线程安全。我通常会避免使用这种方法,因为如果有必要,你无法同步创建,这会违反实例单例。