Как сделать синглтон в Java? Типы инициализации, сравнение и важные моменты

Опубликовано: 2020-10-07

Одноэлементный класс в Java определяется как класс, который имеет только один объект, то есть только один экземпляр класса. Ограничение экземпляра только одним экземпляром на класс помогает в кодировании определенных программ, которым требуется только один экземпляр класса. Единственному экземпляру одноэлементного класса предоставляется глобальная точка доступа.

Класс Singleton — один из важных шаблонов проектирования в программировании на Java. Классы Singleton помогают в ограничении ресурсов и их оптимизации; он часто используется в соединениях с базами данных или сокетах. Существуют синтаксис реализации для одноэлементного класса, и хороший разработчик должен знать об этом. Давайте посмотрим на реализацию класса singleton в Java.

Изучайте программы для инженеров-программистов онлайн в лучших университетах мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.

Читать: Объяснение архитектуры и компонентов Java

Оглавление

Инициализация

Инициализация синглтона в Java выполняется через частный конструктор. Частные конструкторы помогают в других классах, которые не могут создать тот же экземпляр, что и ваш одноэлементный класс. Существует пять типов инициализации одноэлементного класса в Java, которые перечислены ниже:

1. Нетерпеливая инициализация

Создается общедоступный метод, обычно называемый getInstance(). Этот метод поможет предоставить только одну точку входа для создания экземпляра класса, что сделает его одноэлементным классом. Экземпляр класса в активной инициализации создается во время загрузки класса.

Этот тип метода инициализации создает экземпляр класса автоматически, даже если пользователь его не использует. Это может вызвать проблемы с памятью и ненужную длину кода. Чтобы противостоять проблеме утечки памяти, давайте рассмотрим другой тип метода инициализации для одноэлементного класса в Java.

2. Ленивая инициализация

Экземпляр класса инициализируется в самом методе getInstance() в ленивой инициализации. Метод ленивой инициализации будет проверять, создан экземпляр класса или нет, и если он не создан, то только он создает экземпляр, тем самым решая проблему утечки памяти.

Метод, который создается при ленивой инициализации, является статическим и имеет объект возвращаемого типа. Экземпляр синглтона в ленивой инициализации не будет создан до тех пор, пока метод getInstance() не будет вызван в первый раз.

3. Ленивая инициализация с методом двойной блокировки

Этот метод используется во время более чем одного потока. Если мы используем в программе два потока, и к обоим из них можно получить доступ через оператор if при запуске, когда экземпляр имеет значение null, это создаст конфликтную ситуацию, и вы можете найти ошибки.

Эта проблема решается методом двойной блокировки, при котором только один поток одновременно входит в синхронизированный блок для инициализации экземпляра, в то время как другой поток блокируется. Когда первый поток выходит из синхронизированного блока, только второй поток входит и создает другой экземпляр. По умолчанию второй поток не проверяет, является ли экземпляр ненулевым или нет.

4. Метод ленивой загрузки

В этом методе создается вложенный внутренний класс, который работает на принципах JLS (спецификации языка Java). В классе не было бы статических элементов данных; JVM не будет создавать экземпляр класса. Экземпляр будет создан только по требованию, когда мы вызовем метод getInstance().

Вам не нужно синхронизировать метод для инициализации и загрузки, поскольку этот метод помогает в автоматической синхронизации всех вызовов получения Instance().

5. Метод перечисления

Несколько экземпляров одноэлементного класса все еще могут быть созданы путем сериализации и отражения в вышеуказанных методах. В случае создания строгого одноэлементного класса можно использовать этот метод. Поля Enum используются в этом методе, который является константой и запускается только во время компиляции.

Enum является экземпляром типа Enum и будет создан только тогда, когда тип Enum вызывается/вызывается в первый раз в коде. Этот метод ограничивает клонирование экземпляра и создает идеальный одноэлементный класс.

Также читайте: 12 лучших программ шаблонов на Java, которые вы должны проверить сегодня

Сериализация и отражение

Сериализация помогает в переносе объектов Java из одной JVM (виртуальная машина Java) в другую. Сериализация — это один из методов, используемых для создания нескольких экземпляров класса. Сериализация преобразует объект в поток байтов, а затем выполняется передача.

Поток байтов помогает воссоздать объект в какой-либо другой JVM, используя процесс десериализации. Это помогает нескольким системам общаться и обмениваться объектами между ними. Это помогает в кросс-синхронизации JVM, поскольку объекты будут работать в разных JVM.

Отражение также является методом клонирования объектов в Java. Reflection — это API, который помогает нам узнать класс любого неизвестного объекта и методы этого конкретного класса, к которым можно получить доступ через объект. Отражение широко используется программистами для изменения поведения классов и методов во время выполнения.

При отражении используются три основные команды: getClass(), чтобы узнать класс, к которому принадлежит объект, getConstructors(), чтобы получить общедоступные конструкторы класса объекта, getMethods(), чтобы узнать общедоступные методы наблюдаемого класса.

Нормальный класс против одноэлементного класса

Стандартный класс в Java использует конструкторы для своей инициализации, тогда как мы используем метод getInstance() для инициализации одноэлементного класса. Мы также можем использовать одно и то же имя класса и метода. Сначала мы создаем объект для обычных классов, а затем используем его методы и свойства.

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

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

Скрытые зависимости также иногда создаются одноэлементным классом, поскольку ссылка на одноэлементный класс передается другим методам и не является полностью прозрачной, что затрудняет отслеживание методов и классов кодировщиками/разработчиками. Следует помнить об этих недостатках перед созданием одноэлементного шаблона и пытаться свести их к минимуму.

Очки для создания идеального класса Singleton

1. Для создания идеального одноэлементного класса необходимо сосредоточить внимание на следующих моментах:

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

3. Сделайте свой одноэлементный класс доказательством отражения, изменив видимость конструктора для публики во время выполнения и убедившись, что существует только один экземпляр любого конкретного одноэлементного класса.

4. При наличии нескольких потоков можно использовать модификатор volatile, который не позволяет потоку просматривать инициализированное состояние других потоков. Модификатор volatile работает с отношением «происходит до», в котором запись происходит в потоке до того, как любой другой поток сможет ее прочитать.

Обязательно к прочтению: интересные идеи Java-проектов для начинающих

Заключение

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

Если вы хотите улучшить свои навыки работы с Java, вам нужно взяться за эти Java-проекты. Если вам интересно узнать больше о Java и полной разработке стека, ознакомьтесь с программой Executive PG upGrad и IIIT-B по разработке программного обеспечения — специализация в разработке полного стека , которая предназначена для работающих профессионалов и предлагает более 500 часов тщательного обучения, 9 + проекты и задания, статус выпускника IIIT-B, практические практические проекты и помощь в трудоустройстве в ведущих фирмах.

Станьте разработчиком полного стека

Подать заявку на степень магистра компьютерных наук