任何人都可以解释在以下单例模式代码中如何进行延迟初始化?
public class Singleton
{
private static Singleton INSTANCE = null;
private Singleton() {}
public static Singleton getInstance()
{
if (INSTANCE == null)
INSTANCE = new Singleton();
return INSTANCE;
}
}
答案 0 :(得分:7)
第一次调用getInstance()
时,INSTANCE
为空,并使用INSTANCE = new Singleton();
进行初始化。如果从未使用它,则具有不初始化实例的优点。
如果可以由多个线程访问,则应该将此代码改进为线程安全。
答案 1 :(得分:1)
Lazy表示第一次使用时初始化实例。
这是一个渴望的例子,它在使用之前已初始化。
public class Singleton
{
private static Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance()
{
return INSTANCE;
}
}
答案 2 :(得分:1)
初始化类时,实例仅创建 ,只有在调用getInstance
时才会初始化类。
您可能想访问JLS - 12.4.1. When Initialization Occurs:
类或接口类型T将在紧接之前初始化 首次出现以下任何一种情况:
T是一个类,并创建了一个T实例。
T是一个类,调用T声明的静态方法。
分配由T声明的静态字段。
使用T声明的静态字段,该字段不是常量 变量(§4.12.4)。
T是顶级类(第7.6节)和断言语句(第14.10节) 在词典中嵌套在T(§8.1.3)中执行。