2017-07-05 33 views
1

的Singleton模式,我有这样的的Java实现饿

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之后创建。

那么哪一个合适?

为什么?

的问题是不重复的。

它不谈论时静态类初始化发生,但关于饥饿实施Singleton模式有些怀疑。

可能是在这种情况下,张贴在这个问题上的类几乎肯定不会被初始化之前的getInstance被称为第一次。

+1

对我来说,如果这个问题是“什么时候静态类初始化发生?这个问题是关于建议的Singleton实现的正确性。 – Doleron

+0

在这种情况下类实例化后,类成员没有实例化,它在类被初始化时实例化,也就是在这种情况下,在第一次调用getInstance时实例化。但是,请记住,这是一个不必要的复杂单例实现。更简单的是'public enum Singleton {INSTANCE; }'。 –

回答

0

第二个说法是错误的,在创建一流他们在被加载,而不是在这个类的第一个实例时,静态成员被初始化。

很容易证明,因为你并不需要一个类的实例来访问它的静态成员 即 MyClass.intVar = 5正常工作。 你不需要首先实例化MyClass。

+1

当类加载时,类的静态成员不会被初始化!它们在初始化类时被初始化。在这个问题中发布的类几乎肯定不会被初始化,直到第一次调用getInstance。那时实例将被初始化为静态引用,直到那时,或者至少不会发生其他符合条件的事件,但是此代码不承认其他合格事件。 –

+0

我明白了,谢谢! – huster