В Java шаблон Singleton — это шаблон творческого проектирования, который гарантирует существование только одного экземпляра класса в приложении. Существует два распространенных подхода к реализации шаблона Singleton: быстрая инициализация и ленивая инициализация. В этой статье мы сосредоточимся на подходе активной инициализации, при котором создается экземпляр класса Singleton во время загрузки класса. Мы рассмотрим различные методы реализации быстрой инициализации в Java, а также приведем примеры кода.
Метод 1: Простая нетерпеливая инициализация
Самый простой способ реализовать нетерпеливую инициализацию — создать частный статический экземпляр класса Singleton и предоставить общедоступный статический метод для доступа к этому экземпляру.
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
// Private constructor to prevent instantiation
}
public static Singleton getInstance() {
return instance;
}
}
Метод 2: использование статического блока
Другой метод достижения быстрой инициализации — использование статического блока для создания экземпляра класса Singleton. Такой подход позволяет нам выполнять дополнительные операции во время создания экземпляра.
public class Singleton {
private static final Singleton instance;
static {
try {
instance = new Singleton();
// Additional operations can be performed here
} catch (Exception e) {
throw new RuntimeException("Failed to create singleton instance");
}
}
private Singleton() {
// Private constructor to prevent instantiation
}
public static Singleton getInstance() {
return instance;
}
}
Метод 3: Enum Singleton
Java обеспечивает поддержку на уровне языка для реализации синглтонов с использованием перечислений. Одиночные элементы перечисления по своей сути потокобезопасны и обеспечивают гарантии сериализации.
public enum Singleton {
INSTANCE;
// Additional methods and variables can be added here
}
Метод 4: Идиома инициализации держателя по требованию
Идиома инициализации держателя по требованию (IODH) — это потокобезопасный метод, который откладывает инициализацию экземпляра Singleton до тех пор, пока к нему не будет осуществлен первый доступ.
public class Singleton {
private Singleton() {
// Private constructor to prevent instantiation
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
Подход нетерпеливой инициализации в шаблоне Java Singleton обеспечивает простой способ гарантировать существование только одного экземпляра класса. Мы рассмотрели несколько методов реализации быстрой инициализации, включая простой подход с использованием статического блока, перечислений и идиому инициализации держателя по требованию. В зависимости от требований вашего приложения вы можете выбрать наиболее подходящий метод реализации паттерна Singleton.