Вы ближе к обычному способу реализации одноэлементного шаблона в Java, чем ваш коллега. Пожалуйста, взгляните на Википедию . Там вы найдете 3 наиболее распространенных реализации Java:
Традиционный простой способ
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
// Private constructor prevents instantiation from other classes
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
«Решение Билла Пью»
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() {}
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Традиционный простой способ с использованием синхронизации
public class Singleton {
// volatile is needed so that multiple threads can reconcile the instance
// semantics for volatile changed in Java 5.
private volatile static Singleton singleton;
private Singleton() {}
// synchronized keyword has been removed from here
public static Singleton getSingleton() {
// needed because once there is singleton available no need to acquire
// monitor again & again as it is costly
if (singleton == null) {
synchronized (Singleton.class) {
// this is needed if two threads are waiting at the monitor at the
// time when singleton was getting instantiated
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
Ни один из них не использует отдельный метод initObject()
(инициализация должна быть внутри приватного конструктора). Также обратите внимание, что если у вас есть отдельный публичный метод initObject()
, у вас могут быть проблемы с многопоточностью ...
Кстати, лично я предпочитаю использовать альтернативу "Билла Пью", но 3 способа действительны.
Редактировать После любезного комментария Esko я добавляю следующую реализацию, , которая недоступна в Википедии . Я просто хотел бы добавить, что 1) Экземпляр синглтона не создается лениво, как 3 варианта выше; 2) Поскольку это enum, вы не можете расширять любой класс; и 3) Это очень, очень странно. Но, похоже, это довольно распространено в сообществе Java, поэтому оно здесь:
Enum way
public enum Singleton {
INSTANCE;
Singleton() {
/* Your init code goes here */
}
}