Обязательно ли использовать статический метод для реализации паттерна Singleton?

«Обязательно ли использовать статический метод для реализации паттерна Singleton?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, статический метод — распространенный, но не единственный способ. Его основная роль — предоставить глобальную точку доступа к единственному экземпляру.

Классическая реализация со статическим методом 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:

  1. Enum (рекомендовано в Java):

    public enum EnumSingleton {
        INSTANCE;
        public void doWork() { /* ... */ }
    }
    // Использование: EnumSingleton.INSTANCE.doWork();

    Потокобезопасно, сериализуемо и защищено от рефлексии.

  2. Через Dependency Injection (DI): Контейнер (Spring, Guice) управляет жизненным циклом объекта как синглтона в scope приложения.

    @Service // Аннотация Spring для бина-синглтона
    public class ServiceSingleton { /* ... */ }

Ключевые элементы Singleton:

  • Приватный конструктор.
  • Статическое поле для хранения экземпляра.
  • Контролируемый способ получения этого экземпляра (статический метод, enum, DI).