Я занимался некоторыми исследованиями о синглетонах, в частности, относительно ленивой и нетерпеливой инициализации одиночных особей.
Пример ожидающей инициализации:
public class Singleton
{
//initialzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
но, как показано выше, он ожидает инициализации, и безопасность потока остается равной jvm но теперь я хочу иметь такую же структуру, но с ленивой инициализацией.
поэтому я придумываю такой подход:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
Как показано выше, так как строка
private static final Foo INSTANCE = new Foo();
выполняется только тогда, когда фактически используется класс FooLoader, это заботится о ленивом экземпляре, и гарантируется, что он будет потокобезопасным.
Правильно ли это?