【问题标题】:Java singleton pattern of hungry implementation [duplicate]饥饿实现的Java单例模式[重复]
【发布时间】:2017-07-05 16:35:13
【问题描述】:

我有一些这样的代码

public class MySingleton {  

private static MySingleton instance = new MySingleton();  

private MySingleton(){}  

public static MySingleton getInstance() {  
    return instance;  
}  }  
  1. 这是 Java 中单例模式的饥饿实现,我们知道在调用 getInstance 之前已创建实例。

  2. 我们还知道在实例化 MySingleton 类时会实例化静态成员。只有在上面的代码中调用了 getInstance 时,才会实例化类 MySingleton。因此,实例是在调用 getInstance 之后创建的。

那么哪一个是对的??

为什么?

问题不重复。

它没有谈论静态类初始化何时发生,而是对单例模式的饥饿实现存在一些疑问。

在这种情况下,这个问题中发布的类几乎肯定不会在第一次调用 getInstance 之前被初始化。

【问题讨论】:

  • 我不清楚这个问题是否与“静态类初始化何时发生?”重复。这个问题是关于建议的单例实现的正确性。
  • 在这种情况下,类成员在类被实例化后不会被实例化,它在类被初始化时被实例化,在这种情况下,也是在第一次调用getInstance时。但是,请记住,这是单例的不必要的复杂实现。更简单的是public enum Singleton { INSTANCE; }

标签: java static singleton


【解决方案1】:

第二条语句为假,静态成员在加载它们所在的类时初始化,而不是在创建该类的第一个实例时。

它很容易展示,因为您不需要类的实例来访问其静态成员 IE。 MyClass.intVar = 5 工作正常。 您不需要先实例化 MyClass。

【讨论】:

  • 类的静态成员在加载类时初始化!它们在类初始化时被初始化。在第一次调用 getInstance 之前,几乎可以肯定在这个问题中发布的类不会被初始化。那时,实例将被初始化为静态引用,直到那时,或者至少直到其他一些符合条件的事件发生,但这段代码不允许其他符合条件的事件。
  • 我知道了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2010-11-12
  • 2012-07-26
相关资源
最近更新 更多