Ответ
Нет, статический метод — распространенный, но не единственный способ. Его основная роль — предоставить глобальную точку доступа к единственному экземпляру.
Классическая реализация со статическим методом getInstance():
public class Singleton {
// Статическое поле для хранения экземпляра
private static Singleton instance;
// Приватный конструктор
private Singleton() {}
// Статический метод доступа
public static Singleton getInstance() {
if (instance == null) { // Lazy initialization
instance = new Singleton();
}
return instance;
}
}
Альтернативные реализации Singleton:
-
Enum (рекомендовано в Java):
public enum EnumSingleton { INSTANCE; public void doWork() { /* ... */ } } // Использование: EnumSingleton.INSTANCE.doWork();Потокобезопасно, сериализуемо и защищено от рефлексии.
-
Через Dependency Injection (DI): Контейнер (Spring, Guice) управляет жизненным циклом объекта как синглтона в scope приложения.
@Service // Аннотация Spring для бина-синглтона public class ServiceSingleton { /* ... */ }
Ключевые элементы Singleton:
- Приватный конструктор.
- Статическое поле для хранения экземпляра.
- Контролируемый способ получения этого экземпляра (статический метод, enum, DI).