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

时间:2013-09-05 10:52:42

标签: java singleton

Java中的单例是否应该使用静态变量或成员变量?两者都有任何优势吗?

7 个答案:

答案 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)

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

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

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

这可以带来巨大的优势。

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