为什么静态字段用于单例?

时间:2014-01-29 16:29:31

标签: design-patterns singleton

我最近一直在阅读单身人士,我常常看到如下代码:

private static SingletonDemo instance = null;

在Singleton类中作为字段。

我不想特别了解'静态'正在做什么以及为什么需要它。

我阅读了Oracle网站here。并且他们使用numOfBicycles(这是你有多个自行车的时候)的例子来证明使用静态字段是合理的,但我想我正在理解为什么在你实例化1个实例时使用它的原因。

7 个答案:

答案 0 :(得分:7)

关键是你需要一种访问已经创建的单个实例的方法 - 它实际上是一个全局变量。这正是静电场所达到的目标。 (至少,就相关的类加载器而言,它是全局的,这在大多数情况下都是重要的。)

如果它是一个实例变量,那么只有在你已经有一个对单例对象的引用时才能找到对单例对象的引用,这使它变得毫无意义。

大多数单例实现都有静态getInstance方法或类似方法。考虑如何在没有静态字段的情况下实现,并且您可能更好地了解为什么需要它。

(另外,在大多数情况下,我建议不要使用单例模式。使用依赖注入的方式最终只能在生产中创建一个实例,但每个类不是单个每个se 通常最终会为您提供更多可测试和灵活的代码。)

答案 1 :(得分:1)

单例内的静态实例变量意味着保存将存在的类的唯一实例。它是静态的,因为它需要由将返回实例的静态方法'GetInstance()'引用,或者如果它是第一次调用'GetInstance()'则将创建实例。

我喜欢将static视为一个成员在所有类中共享,而不是仅允许类的实例访问其成员。

答案 2 :(得分:1)

static确保只有一个实例分配给实例变量。如果使用静态getInstance()方法,如何在sta5ic方法中为成员变量赋值?

答案 3 :(得分:1)

正如其他人所说,它可以被程序的其他部分全局访问。单身人士可以使用共享配置数据,只要它是不可变的,但是应该小心使用它们。

如果你要创建一个单例,我建议使用Joshua Block在Effective Java中描述的enum方法。

public enum MySingleton {
       INSTANCE;
   }

然后,您将所有方法添加到枚举中,并通过MySingleton.INSTANCE.myMethod()访问它们。 JVM将确保枚举的构造是同步的,并强制只有一个枚举实例 - 只要你只定义一个枚举字段。

答案 4 :(得分:0)

静态不需要实例化类。为了能够计算实例化类的次数,您必须拥有一个独立于实例化的计数器。

在单身人士的情况下,你只想要一个,但你可以按照这个模式确保你只有x个不定期。

答案 5 :(得分:0)

单例模式的目的是创建一个类的单个对象,该对象随时可用于访问,这就是为此使用静态字段的原因。

  

static variable是一个静态分配的变量 - 其生命周期或“范围”在整个程序运行中延伸

答案 6 :(得分:0)

Singleton的工作原理是为整个程序范围提供一个实例。您可以为Singleton创建Singleton或静态字段的静态实例,因为您可以允许程序调用新的Singleton(如果尚未初始化),但是您不会创建多个Singleton。这些静态字段确保正确使用模式,您不能拥有Singleton的多个实例。