Should a Java singleton use static variables?
Java中的单体是否应该使用静态变量或成员变量?两者都有什么好处吗?
您应该使用成员变量。单例是一个对象(即类的一个实例),因此应该这样建模;即使您只打算创建其中的一个。
静态应用于类级变量。
需要有对singleton实例的静态引用,但是实例本身应该使用实例变量,就像常规类一样。
原因是单例实例毕竟是一个对象,所以通常良好的设计原则仍然适用于它的类。
此外,今天它是单例的,但是明天它可能是线程本地的,或者没有任何类型的实例创建限制。如果以通常的方式设计类,那么这些体系结构选择之间的变化非常小。如果使用静态字段,则需要进行更多的维护工作才能使字段非静态。
您可以避免使用静态变量,而是使用
1 2 3 | public enum MySingleton { INSTANCE; } |
您可以以
枚举是线程安全的,通过枚举实现singleton可以确保您的singleton即使在多线程环境中也只有一个实例。
这取决于具体的变量。显然,最常见的用法是singleton是保存成员变量的普通对象。例如,您可以轻松地用另一个对象替换一个对象(使用所有其他属性)。
每个类都可以有静态变量,但不管是否为单例,它都不会依赖。
单例模式的本质是处理对象的实例。静态是类的度量——>与单例模式没有关系。
使用静态变量不是必需的。也可以使用枚举
看到这个
不要求使用静态变量或成员变量。由于singleton在逻辑上只有一个实例,所以使用静态变量或成员变量没有任何区别。除了静态变量和实例变量差异保持不变外,静态变量将在类加载期间初始化,但实例变量将在实例创建期间初始化。
但作为一般编程规则,您应该决定是否需要静态变量。不要简单地创建公共静态变量并以不必要的问题结束。因此,在我个人看来,实例变量应该是保持简单和控制的首选。
已经给出了很多信息:使用静态变量或指向实例的静态变量或使用枚举。
一个很大的区别是当你的单吨是一个类的成员,这个类是另一个类的子类。
因此,您的单例实例继承自超级类。
这可能有巨大的优势。
不允许枚举相互扩展,但可以使用实现接口的枚举。