Java单体是否应该使用静态变量?

Should a Java singleton use static variables?

本问题已经有最佳答案,请猛点这里访问。

Java中的单体是否应该使用静态变量或成员变量?两者都有什么好处吗?


您应该使用成员变量。单例是一个对象(即类的一个实例),因此应该这样建模;即使您只打算创建其中的一个。

静态应用于类级变量。


需要有对singleton实例的静态引用,但是实例本身应该使用实例变量,就像常规类一样。

原因是单例实例毕竟是一个对象,所以通常良好的设计原则仍然适用于它的类。

此外,今天它是单例的,但是明天它可能是线程本地的,或者没有任何类型的实例创建限制。如果以通常的方式设计类,那么这些体系结构选择之间的变化非常小。如果使用静态字段,则需要进行更多的维护工作才能使字段非静态。


您可以避免使用静态变量,而是使用Enum

1
2
3
public enum MySingleton {
    INSTANCE;
}

您可以以MySingleton.INSTANCE的身份访问这个singleton。

枚举是线程安全的,通过枚举实现singleton可以确保您的singleton即使在多线程环境中也只有一个实例。


这取决于具体的变量。显然,最常见的用法是singleton是保存成员变量的普通对象。例如,您可以轻松地用另一个对象替换一个对象(使用所有其他属性)。

每个类都可以有静态变量,但不管是否为单例,它都不会依赖。

单例模式的本质是处理对象的实例。静态是类的度量——>与单例模式没有关系。


使用静态变量不是必需的。也可以使用枚举

看到这个


不要求使用静态变量或成员变量。由于singleton在逻辑上只有一个实例,所以使用静态变量或成员变量没有任何区别。除了静态变量和实例变量差异保持不变外,静态变量将在类加载期间初始化,但实例变量将在实例创建期间初始化。

但作为一般编程规则,您应该决定是否需要静态变量。不要简单地创建公共静态变量并以不必要的问题结束。因此,在我个人看来,实例变量应该是保持简单和控制的首选。


已经给出了很多信息:使用静态变量或指向实例的静态变量或使用枚举。

一个很大的区别是当你的单吨是一个类的成员,这个类是另一个类的子类。

因此,您的单例实例继承自超级类。

这可能有巨大的优势。

不允许枚举相互扩展,但可以使用实现接口的枚举。