Я нашел три способа создания экземпляра синглтона, но я сомневаюсь, лучший ли какой-либо из них. Я использую их в многопоточной среде и предпочитаю ленивое создание экземпляров.
Пример 1:
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, но я ее просто не понимаю.
Здесь возникает вопрос - в каких случаях мне следует / не следует использовать какие-либо из этих вариантов? Я не ищу пространных объяснений (на эту тему есть много других тем, но все они в конечном итоге превращаются в споры ИМО), я бы хотел, чтобы это было понятно в нескольких словах.