Я нашел три способа создания экземпляра Singleton, но у меня есть сомнения относительно того, является ли какой-либо из них лучшим из существующих. Я использую их в многопоточной среде и предпочитаю ленивую реализацию.
Образец 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;
}
В проекте, которым я пользуюсь, везде используется Sample 2, но мне больше нравится Sample 3. Существует также версия Enum, но я просто не понимаю.
Вопрос здесь - в каких случаях я не должен / не должен использовать какие-либо из этих вариантов? Хотя я не ищу длинных объяснений (есть много других тем по этому поводу, но все они в конечном итоге превращаются в спор о ИМО), я бы хотел, чтобы это было понятно несколькими словами.