2014-05-17 239 views
4

的渴望实例我有一个Singleton辛格尔顿

public class Singleton 
{ 
    private static Singleton instance = new Singleton(); 

    private Singleton() 
    { 
     System.out.println("Instance created."); 
    } 

    public static Singleton getInstance() 
    { 
     return instance; 
    } 
} 

我可以运行此代码,但没有被创建的实例,除非getInstance()被调用。这很奇怪,因为我使用急切实例化,所以构造函数中的println()应该执行。

有人可以解释一下吗?

+0

那么,你需要一种方法来首先执行该构造函数。这是与'getInstance' –

+0

该类不会被初始化,直到“第一(嘟嘟)参考”。简单地加载类不会初始化它,但是(除其他之外)调用类的静态方法。 –

+0

这个规定很清楚是什么原因导致类的初始化:http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.5 –

回答

5

实例将没有生成,直到类将被装载的第一次,如果你想急于初始化,而不必调用getInstance()方法,你可以调用

Class.forName(Singleton.class.getName()); 

在初始化

你有实例作为静态字段,静态字段被初始化的类加载事件,所以如果你想急于初始化一旦类在代码中的某处访问您只需加载类热切

+0

能否请您解释一下? –

+0

所以实质上,只有在需要时才会创建实例?有点像懒惰的实例化吧?除非我用'的Class.forName(Singleton.class);' – user3648439

+0

@user看到UDPATE –

2

,所有的静态变量相关的无线网络它被加载并赋值。

如果程序中第一个使用类的地方是你调用getInstance()的地方,那么该类将被加载,静态变量将被初始化,并且构造函数将被运行。