我有以下定义,您可以根据定义将其称为延迟加载的单例:
public class MySingleton {
public static String myTrigger="a trigger";
private MySingleton(){
}
private static enum LazyLoad {
IMDB_LOOKUP_INSTANCE;
private static final IMDB_LOOKUP = new MySingleton();
}
public static MySingleton getInstance() {
return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
}
}
当我这样打电话时会发生什么:
String someString = MySingleton.myTrigger;
单例不会被实例化吗?
最佳答案
经过测试(通过将打印语句放入构造函数中),我发现-
在上面的代码中,直到调用MySingleton.getInstance()时,实例化才会发生。
但是,如果将静态MySingleton对象放置为类的直接属性,而不是在枚举内部,则将在对MySingleton.myTrigger的调用中实例化该对象,这是因为在加载类时会实例化所有静态字段。
但是对于enum,enum不是该类的静态属性,它仅在访问时加载。
我也测试过类似的东西-
class MySingleton {
public static String myTrigger="a trigger";
private MySingleton(){
System.out.println("Printing");
}
public static enum LazyLoad {
IMDB_LOOKUP_INSTANCE;
public static final String Hello = "Hello";
private static final MySingleton IMDB_LOOKUP = new MySingleton();
}
public static MySingleton getInstance() {
return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
}
}
在上面,对
MySingleton.LazyLoad.IMDB_LOOKUP_INSTANCE.Hello
的调用也将导致MySingleton对象的实例化。