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