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

Java单例应该使用静态变量吗?,java,singleton,Java,Singleton,Java中的单例应该使用静态变量还是成员变量?两者都有好处吗?您应该使用成员变量。一个单例是一个对象(即一个类的实例),因此应该这样建模;即使你只想创造其中一个 静态应用于类级变量。您可以避免使用静态变量,而是使用Enum: public enum MySingleton { INSTANCE; } 您可以通过MySingleton.INSTANCE访问此单例 Enum是线程安全的,通过Enum实现Singleton可以确保您的Singleton即使在多线程环境中也只有一个实例 没有强

Java中的单例应该使用静态变量还是成员变量?两者都有好处吗?

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


静态应用于类级变量。

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

public enum MySingleton {
    INSTANCE;
}
您可以通过
MySingleton.INSTANCE
访问此单例


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

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


但作为一般编程规则,您应该决定是否需要静态变量。不要简单地创建公共静态变量,最终导致不必要的问题。因此,在我个人看来,最好使用实例变量来保持简单和可控。

使用静态变量不是强制性的。您也可以使用enum


参见

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

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


单例模式本质上处理对象的实例。静态是类的集合-->与单例模式无关。

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

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

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

这会有巨大的优势


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

需要对单例实例进行静态引用,但实例本身应该使用实例变量,就像普通类一样

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


此外,今天它是一个单实例,但明天它可能是一个ThreadLocal,或者没有任何实例创建限制。如果类是以通常的方式设计的,那么这些架构选择之间的变化非常小。如果使用静态字段,这样的更改将需要更多的维护工作才能使字段成为非静态的。

请参阅:您将能够在不使用至少一个静态变量的情况下构建单例。@dasblinkenlight是的,我需要一个,但问题是关于所有其他变量,可以是成员变量,也可以是静态变量。@MoritzPetersen我的问题是:如果我使用的是单例模式,我应该使用静态变量还是成员变量?我知道这可以完全使用静态方法和变量来实现,但这不是我要问的。理想情况下,你不应该使用单例。如果我使用单例,我会尝试使其无状态。成员变量是静态变量的父变量为什么是实例变量?@Andreas请参阅编辑以回答为什么枚举是按定义静态的,它只是不显示它使用静态变量。否则,枚举是一个很好的单例实现