Перед тем как отправиться в одиночный маршрут, пересмотрите. Тебе действительно нужен синглтон? Если вы спрашиваете о сценариях, когда вам нужно реализовать синглтоны, то это потому, что потребность в них на самом деле не выражалась. Вам лучше не вводить синглтоны в вашу кодовую базу только потому, что это здорово - следовать шаблонам проектирования.
Переговоры по чистому коду - глобальное состояние и одиночные сообщения
Раз не достаточно
Исполнитель синглетонов
Однако, что действительно стоит знать, так это Внедрение зависимостей .
Теперь, если вы действительно хотите реализовать синглтоны в Java, я бы порекомендовал Джошуа Блоху «Эффективная Java» способ их реализации:
public class Singleton
{
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private Singleton() {}
private static final class SingletonHolder {
static final Singleton instance = new Singleton();
}
}
JLS гарантирует, что JVM не будет инициализировать экземпляр, пока кто-то не вызовет getInstance();
Последнее замечание: шаблон блокировки с двойной проверкой нарушен в Java до Java 5 . Модель памяти Java 5 делает поток шаблона DCL безопасным, но делает его медленнее, чем метод класса SingletonHolder
, в то время как первоначальной целью была оптимизация производительности .
РЕДАКТИРОВАТЬ: Как @Luno указал, , начиная со второго издания книги, предпочтительный способ:
Начиная с версии 1.5, существует третий подход к реализации синглетонов. Просто создайте тип enum с одним элементом:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Этот подход функционально эквивалентен подходу открытого поля, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и обеспечивает железную гарантию от множественных реализаций, даже перед сложными атаками сериализации или отражения. Хотя этот подход еще не получил широкого распространения, одноэлементный тип перечисления является лучшим способом реализации синглтона.