제이온

[Эффективный Java] Элемент 3. Гарантируйте единственность экземпляра с помощью приватного конструктора или перечислимого типа

  • Язык написания: Корейский
  • Страна: Все страныcountry-flag
  • ИТ

Создано: 2024-04-27

Создано: 2024-04-27 00:48

Синглтон

Концепция синглтона

Синглтон — это класс, который можно создать только один раз. Типичными примерами синглтона являются бессостоятельные объекты или уникальные системные компоненты. Однако классы-синглтоны сложно тестировать, если они не определены как тип с помощью интерфейса и его реализации.


Способы создания синглтона

Использование публичного статического члена, являющегося финальным полем



Приватный конструктор вызывается только один раз при инициализации экземпляра Elvis, гарантируя, что он будет единственным во всей системе. Однако, используя AccessibleObject.setAccessible(), можно вызвать приватный конструктор. Этот способ модификации с помощью рефлексии можно заблокировать, выбросив исключение при создании второго объекта.


  • Преимущества
    • Явно указано в API, что данный класс является синглтоном.
    • Лаконичность.


Предоставление статического фабричного метода в качестве public static


Помимо модификации с помощью рефлексии, этот метод также гарантирует, что экземпляр будет единственным во всей системе. Просто поле изменено на private, а возврат объекта осуществляется с помощью статического фабричного метода.


  • Преимущества
    • Можно изменить на не-синглтон, не изменяя API.
      • Например, статический фабричный метод может возвращать разные экземпляры для каждого потока.
    • При желании можно изменить на универсальный (generic) фабричный метод синглтона.
    • Ссылка на метод статического фабричного метода может использоваться в качестве поставщика (supplier).
      • Например, вместо Elvis::getInstance можно использовать Supplier<Elvis>.


Если нет необходимости использовать вышеперечисленные преимущества, лучше использовать первый способ.


Использование перечисления (enum)


Наиболее предпочтительный способ — использование перечисления. Он более безопасен от атак с использованием рефлексии и обеспечивает более чистый код по сравнению с двумя предыдущими способами. Кроме того, как будет описано ниже, два предыдущих способа имеют недостаток: при сериализации необходимо добавлять дополнительный код.

Однако следует помнить, что синглтон, который необходимо создать, может наследовать интерфейс, но не может наследовать класс.


Что нужно учитывать при сериализации класса-синглтона

Для сериализации класса-синглтона, созданного с помощью первого или второго способа, помимо реализации Serializable, необходимо объявить все поля экземпляра как transient и переопределить метод readResolve().



Источники

Комментарии0

DI на уровне фреймворка: под силу даже начинающим разработчикам Node.jsСтатья описывает реализацию внедрения зависимостей (DI) в разработке серверов Node.js. Рассматриваются способы реализации DI с использованием функции метаданных Reflect компилятора TypeScript, а также соответствующие библиотеки.
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

November 8, 2024

История разработки проекта LegiNote 4 — Домашняя сетьЗапись в блоге StatPan о создании сервера для сайд-проекта LegiNote с использованием домашней сети. В статье описывается процесс создания сервера с использованием бесплатного уровня Oracle Cloud Free Tier и мини-ПК, а также опыт настройки домашней сети в
statpan
statpan
statpan
statpan

October 19, 2024

Получение неизменяемых значений с помощью genericПредставляем способ простой передачи неизменяемых значений в generic с помощью нового ключевого слова TypeScript 5.0. Может использоваться с массивами или литеральными типами, что способствует разработке библиотек и улучшению пользовательского опыта.
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

October 30, 2024

Представление SECURET (Сикьюрит) — безопасного мессенджера Web 3.0SECURET — безопасный мессенджер Web 3.0, который можно использовать без регистрации, просто отсканировав QR-код. Он обеспечивает защиту личной информации и анонимность, а также блокирует взломы благодаря одноразовым соединениям.
Hey, Duckky!
Hey, Duckky!
Hey, Duckky!
Hey, Duckky!

June 21, 2024