Java中的单例是否应该使用静态变量或成员变量?两者都有任何优势吗?
答案 0 :(得分:11)
您应该使用成员变量。单例是一个对象(即一个类的实例),因此应该这样建模;即使你只打算创造其中一个。
静态应该用于类级变量。
答案 1 :(得分:7)
需要对单例实例进行静态引用,但实例本身应该使用实例变量,就像常规类一样。
原因是单例实例毕竟是一个对象,所以通常的好设计原则仍然适用于它的类。
此外,今天它是一个单例,但明天它可能是一个ThreadLocal,或者没有任何实例创建限制。如果以通常的方式设计类,那么这些架构选择之间的变化是非常低的。如果使用静态字段,则此类更改将需要更多维护工作才能使字段成为非静态字段。
答案 2 :(得分:5)
您可以避免使用静态变量,而是使用Enum
:
public enum MySingleton {
INSTANCE;
}
您可以MySingleton.INSTANCE
访问此单身人士。
Enum是线程安全的,通过Enum实现Singleton可确保您的单例即使在多线程环境中也只有一个实例。
答案 3 :(得分:3)
这取决于具体的变量。绝对最常见的用法是单例是保存成员变量的普通对象。例如,您可以轻松地将一个对象替换为另一个对象(具有所有其他属性)。
每个类都可以有静态变量,但它不会单独或不单独使用。
Singleton模式本质上处理对象的实例。静力学是类的完美 - >与单身模式无关。
答案 4 :(得分:2)
没有使用静态变量或成员变量的任务。因为单例只有逻辑上只有一个实例,所以使用static或member变量没有任何区别。除了静态和实例变量差异保持之外,静态变量将在类加载期间初始化,但实例变量将在实例创建期间初始化。
但作为一般编程规则,您应该决定是否需要静态变量。不要简单地创建公共静态变量并最终导致不必要的问题。因此,在我个人看来,实例变量应该是首选,以保持简单和控制。
答案 5 :(得分:2)
它不是必须使用静态变量。您也可以使用枚举
请参阅this
答案 6 :(得分:1)
已经提供了很多信息:使用静态变量或指向实例的静态变量或使用枚举。
一个很大的区别是当你的单吨是一个类的成员时,它是另一个类的子类。
因此,您的单例实例继承自超类。
这可以带来巨大的优势。
不允许枚举相互扩展,但您可以使用实现接口的枚举。