Одноэлементный класс в Java - как использовать одноэлементный класс?



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

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

Ниже приведены темы, о которых я расскажу в этой статье:





Давайте начнем.

Что такое синглтон-класс в Java?

С точки зрения непрофессионала, класс Singleton в Java - это класс, который позволяет получить к нему доступ через один экземпляр за раз. Этот шаблон проектирования предназначен для ограничения ненужного создания экземпляров класса и обеспечения того, чтобы только один существует в любой момент времени для каждого экземпляра JVM. Таким образом, с этим шаблоном любой класс, определенный как Singleton, имеет только один экземплярс глобальной точкой доступа к нему. В отличие от обычных классов, одноэлементный класс не уничтожается к концу жизненного цикла приложения.



Но зачем нам вообще нужен класс Singleton?

Что ж, ограничивая создание экземпляров класса, это экономит место в памяти, так как теперь объект не будет создаваться каждый раз при выполнении нового запроса. Вместо этого будет многократно использоваться один объект. Это причина того, что шаблон Singleton в Java в основном используется с и приложения баз данных. Он в основном используется для ведения журнала, кеширования, объединения потоков, настроек конфигурации и многого другого..

Надеюсь, вам понятна концепция класса Singleton в Java. Итак, давайте продолжим в этомSingleton Class в статье Java и посмотрите, как они создаются.



Способы разработки класса Java Singleton

Чтобы создать синглтон класса в Java, вам понадобятся следующие три вещи:

  1. статический член класса
  2. частный конструктор
  3. статический фабричный метод

Поскольку Java позволяет разработчикам исследовать свои горизонты, существуютнесколько способов создания класса Singleton. Ниже я перечислил самые популярные из них.

  1. Метод нетерпеливой инициализации
  2. Ленивый метод инициализации
  3. Поточно-безопасный одноэлементный метод
  4. Ленивая инициализация с методом двойной блокировки
  5. Ленивый метод загрузки
  6. Метод инициализации статического блока

Давайте теперь углубимся в каждый из этих подходов один за другим.

1. Метод активной инициализации

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

  1. Объявите конструктор закрытым.
  2. Следующим шагом является создание частного члена класса для этого класса Singleton.
  3. Теперь вам нужно определить фабричный метод, который будет использоваться для возврата объекта вашего класса, который мы создали как экземпляр члена класса.
  4. Вы даже можете объявить статический член общедоступным, если хотите напрямую обращаться к этому статическому экземпляру.

Теперь давайте посмотрим, как это реализовать.

// Инициализация нетерпеливого открытого класса EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

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

Итак, давайте продвинемся вперед и рассмотрим другой способ создания одноэлементного класса в Java.

2. Ленивый метод инициализации

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

  1. Прежде всего, объявите конструктор закрытым.
  2. Затем вам нужно создать частный статический экземпляр для этого класса, но создавать его пока не нужно.
  3. Наконец, создайте фабричный метод, который сначала проверит, является ли член экземпляра нулевым или нет. В противном случае он создаст для вас экземпляр класса singleton и вернет его.

Код ниже показывает, как это сделать..

// Lazy Initialization public class LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} return INSTANCE}}

3. Потокобезопасный синглтон Метод

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

// Потокобезопасный открытый класс Singleton ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} общедоступный статический синхронизированный ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

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

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

В этом подходе мы не синхронизируем методы. Скорее мы заключаем код создания объекта в синхронизированный блок.Можно сказать, что, предварительно проверив блокировку ниток,снижает количество срабатываний блокировки. Такой подход обычно приводит к повышению производительности приложения. Ознакомьтесь с приведенным ниже кодом, чтобы узнать, как это делается..

// Ленивая инициализация с двойным замком публичного класса LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDoubleclassANCE) {synchronized (LazyDoubleclassANCE) {synchronized (LazyDoubleclass) {if null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

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

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

Ниже приведен код для того же.

что такое init в Python
// Открытый класс метода ленивой загрузки LazyLoadSingleton {private LazyLoadSingleton () {} частный статический класс SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Метод инициализации статического блока.

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

// Инициализация статического блока публичный класс StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // обработка исключений в статическом блоке static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Исключение произошло при создании класса Singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

На этом мы подошли к концу статьи о классе Singleton в Java. Если вы хотите узнать больше о Java, вы можете обратиться к нашему .

Теперь, когда вы поняли, что такое класс Singleton в Java, ознакомьтесь с от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курс обучения и сертификации по Java J2EE и SOA от Edureka предназначен для студентов и профессионалов, которые хотят стать Java-разработчиками. Курс разработан, чтобы дать вам хорошее начало в программировании на Java и обучить вас как основным, так и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этой статье «Класс синглтона в Java», и мы свяжемся с вами как можно скорее.