В Java одноэлементный класс - это класс, который может иметь только один экземпляр в данный момент. Это один из пяти шаблонов творческого дизайна в Java, который помогает без усилий разрабатывать . В рамках этой статьи я дам вам четкое представление о том, что такое одноэлементный класс в Java и как вы можете его создать.
Ниже приведены темы, о которых я расскажу в этой статье:
Давайте начнем.
Что такое синглтон-класс в Java?
С точки зрения непрофессионала, класс Singleton в Java - это класс, который позволяет получить к нему доступ через один экземпляр за раз. Этот шаблон проектирования предназначен для ограничения ненужного создания экземпляров класса и обеспечения того, чтобы только один существует в любой момент времени для каждого экземпляра JVM. Таким образом, с этим шаблоном любой класс, определенный как Singleton, имеет только один экземплярс глобальной точкой доступа к нему. В отличие от обычных классов, одноэлементный класс не уничтожается к концу жизненного цикла приложения.
Но зачем нам вообще нужен класс Singleton?
Что ж, ограничивая создание экземпляров класса, это экономит место в памяти, так как теперь объект не будет создаваться каждый раз при выполнении нового запроса. Вместо этого будет многократно использоваться один объект. Это причина того, что шаблон Singleton в Java в основном используется с и приложения баз данных. Он в основном используется для ведения журнала, кеширования, объединения потоков, настроек конфигурации и многого другого..
Надеюсь, вам понятна концепция класса Singleton в Java. Итак, давайте продолжим в этомSingleton Class в статье Java и посмотрите, как они создаются.
Способы разработки класса Java Singleton
Чтобы создать синглтон класса в Java, вам понадобятся следующие три вещи:
- статический член класса
- частный конструктор
- статический фабричный метод
Поскольку Java позволяет разработчикам исследовать свои горизонты, существуютнесколько способов создания класса Singleton. Ниже я перечислил самые популярные из них.
- Метод нетерпеливой инициализации
- Ленивый метод инициализации
- Поточно-безопасный одноэлементный метод
- Ленивая инициализация с методом двойной блокировки
- Ленивый метод загрузки
- Метод инициализации статического блока
Давайте теперь углубимся в каждый из этих подходов один за другим.
1. Метод активной инициализации
Это самый простой способ создания класса Singleton, в котором экземпляр создается во время загрузки класса. Чтобы создать одноэлементный класс с помощью этого метода, вам необходимо выполнить следующие шаги:
- Объявите конструктор закрытым.
- Следующим шагом является создание частного члена класса для этого класса Singleton.
- Теперь вам нужно определить фабричный метод, который будет использоваться для возврата объекта вашего класса, который мы создали как экземпляр члена класса.
- Вы даже можете объявить статический член общедоступным, если хотите напрямую обращаться к этому статическому экземпляру.
Теперь давайте посмотрим, как это реализовать.
// Инициализация нетерпеливого открытого класса EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}
Если вы видите код, вы можете заметить, что каждый раз, когда мы создаем экземпляр объекта, мы используемgetInstance ()метод вместо вызова класса строитель .Но у него есть свои недостатки. Если вы используете этот метод для создания одноэлементного класса, то экземпляр будет создан независимо от того, использует его приложение или нет.
Итак, давайте продвинемся вперед и рассмотрим другой способ создания одноэлементного класса в Java.
2. Ленивый метод инициализации
Этот метод называется ленивой инициализацией, поскольку он откладывает создание экземпляра класса до его первого использования. Я имею в виду, что с помощью этого метода объект создается, только если он нужен. Это помогает избежать ненужного создания . Чтобы спроектировать одноэлементный класс таким образом, вам необходимо выполнить следующие шаги:
- Прежде всего, объявите конструктор закрытым.
- Затем вам нужно создать частный статический экземпляр для этого класса, но создавать его пока не нужно.
- Наконец, создайте фабричный метод, который сначала проверит, является ли член экземпляра нулевым или нет. В противном случае он создаст для вас экземпляр класса 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», и мы свяжемся с вами как можно скорее.