Я нашел три способа создания экземпляра Singleton, но у меня есть сомнения относительно того, является ли любой из них лучшим. Я использую их в многопоточной среде и предпочитаю ленивый экземпляр.
Пример 1:java singleton instantiation
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
Пример 2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
Пример 3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
Проект Я использую ATM использует образец 2 везде, но я вроде как образец Еще 3. Существует также версия Enum, но я ее просто не понимаю.
Вопрос здесь - в каких случаях я должен/не должен использовать какие-либо из этих вариантов? Хотя я не ищу длительных объяснений (в этом много других тем, но все они в конечном итоге превращаются в аргументацию ИМО), я бы хотел, чтобы это было понятно с несколькими словами.
Но как его использовать? Например, у меня есть следующее: public class MyClass { public enum ClassName { INSTANCE; // Я помещаю все свои методы здесь, а не ... } // здесь, как обычно? } Редактировать: damn it, no форматирование комментариев? Ненавидеть это! – jurchiks
Вы пишете свои однотонные поля и методы ниже. И затем получите доступ к ним через ClassName.INSTANCE.doSomething (foo) ' – Bozho
@jurchiks: yes. В другом месте вы бы назвали 'ClassName.INSTANCE.methodName()', чтобы использовать методы singleton (или, возможно, использовать статический импорт, чтобы избавиться от 'ClassName.INSTANCE.'). – Carl