I saw 像这样的答案,试图通过comments,并不满意例子在这里.
也许是时候提出这个具体问题了......
为什么调用枚举单例实现lazy?
public enum EnumLazySingleton {
INSTANCE;
EnumLazySingleton() {
System.out.println("constructing: " + this);
}
public static void touchClass() {}
}
它有何不同eager执行?
public class BasicEagerSingleton {
private static final BasicEagerSingleton instance = new BasicEagerSingleton();
public static BasicEagerSingleton getInstance() {
return instance;
}
private BasicEagerSingleton() {
System.out.println("constructing: " + this);
}
public static void touchClass() {}
}
两者都会在不访问的情况下初始化实例INSTANCE/getInstance()
- 例如称呼touchClass()
.
public class TestSingleton {
public static void main(String... args) {
System.out.println("sleeping for 5 sec...");
System.out.println("touching " + BasicEagerSingleton.class.getSimpleName());
BasicEagerSingleton.touchClass();
System.out.println("touching " + EnumLazySingleton.class.getSimpleName());
EnumLazySingleton.touchClass();
}
}
Output:
sleeping for 5 sec...
touching BasicEagerSingleton
constructing: BasicEagerSingleton@7bfcd12c
touching EnumLazySingleton
constructing: INSTANCE
现在,我们可以说两者都是lazy。什么是eager then?
很明显(例如)“双重检查锁定”方式实际上是懒惰的(并且混乱且缓慢)。但如果 enum 是惰性的,那么any由于不可避免的类加载,单例是惰性的——事实上,一切都是惰性的。到什么时候这种区别将不再有意义?