Singleton Class в Java - Как да използвам Singleton Class?



Тази статия за Singleton Class в Java разказва за различните начини, по които клас може да бъде направен Singleton заедно с практическите имплементации.

В Java единичен клас е клас, който може да има само един екземпляр в даден момент. Това е един от петте модела на креативен дизайн в Java, който помага за лесното разработване на . Чрез средата на тази статия ще ви дам ясна представа за това какво представлява единичен клас в Java и как можете да го създадете.

По-долу са темите, които ще разглеждам в тази статия:





Да започваме.

Какво представлява Singleton Class в Java?

В неспециализиран смисъл, клас Singleton в Java е класът, който позволява достъп до него през един екземпляр наведнъж. Този модел на проектиране е за ограничаване на ненужната инстанция на клас и за гарантиране, че само един съществува по всяко време на всеки екземпляр на JVM. По този начин с този модел всеки клас, който е дефиниран като Singleton, има само един екземплярс глобална точка за достъп до него. За разлика от нормалните класове, единичен клас не се унищожава до края на жизнения цикъл на приложенията.



Но защо изобщо се нуждаем от Singleton Class?

Е, като ограничава създаването на екземпляр на клас, той спестява място в паметта, тъй като сега обектът няма да бъде създаден всеки път, когато е направена нова заявка. Вместо това, един обект ще бъде използван многократно. Това е причината, с която се използва най-вече моделът Singleton в Java и приложения за бази данни. По принцип се използва за регистриране, кеширане, обединяване на нишки, конфигурационни настройки и много други.

сортиращ масив c ++

Надявам се, че сте наясно с концепцията за клас Singleton в Java. И така, нека продължим по-нататък в товаСтатия за Singleton Class в Java и вижте как са създадени.



Начини за проектиране на Java Singleton Class

За да направите сингълтон на клас в Java, имате нужда от следните три неща:

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

Тъй като Java позволява на разработчиците да изследват своите хоризонти, имаредица начини, по които можете да проектирате клас Singleton. По-долу изброих най-популярните.

  1. Нетърпелив метод за инициализация
  2. Мързелив метод за инициализация
  3. Метод за безопасна нишка с нишка
  4. Мързелива инициализация с метод на двойно заключване
  5. Метод на мързеливо натоварване
  6. Метод за инициализация на статичен блок

Нека сега да се потопим по-дълбоко във всеки от тези подходи един по един.

1. Устремен метод за инициализация

Това е най-лесният метод за създаване на клас Singleton, където екземплярът се създава по време на зареждането на класа. За да създадете единичен клас, използвайки този метод, трябва да изпълните следните стъпки:

конвертиране в двоично в python
  1. Обявете конструктора за частен.
  2. Следващата стъпка е да създадете частен член на класа за този клас Singleton.
  3. Сега трябва да дефинирате фабричен метод, който ще се използва за връщане на обекта на вашия клас, който сме създали като екземпляр на члена на класа.
  4. Можете дори да декларирате статичен член като публичен, ако искате да осъществите директен достъп до този статичен екземпляр.

Сега да видим как да ги приложим.

// Eager Initialization публичен клас 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 публичен клас LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} ВРЪЩАНЕ ИНСТАНЦИЯ}

3. Сингъл с нишка Метод

Но горният подход може да породи някои притеснения в едновременните сценарии. Тъй като единичен шаблон се използва главно с много нишки и акомножество нишки влизат в условието if едновременно, това може да повдигне проблеми. За да избегнем това, ние се опитваме да създадем безопасен за нишки клас единичен, като синхронизираме глобалния метод за достъп. Това гарантира, че само една нишка изпълнява този метод във всеки момент от времето. Вижте кода по-долу, за да видите изпълнението:

// Thread Safe Singleton публичен клас ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public static синхронизиран ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSington}

Но понякога този подход може да стане много тромав, както всеки път методъттрябва да изчака заключването да се освободи, преди методът да може да го използва. Това води до забавяне на процеса и ни води към следващия подход, който еМързелива инициализация с двойно заключване.

4. Мързелива инициализация с двойно заключване Метод

При този подход ние не синхронизираме методите. По-скоро обгръщаме кода за създаване на обект в синхронизиран блок.Можете да кажете, че като предварително проверите заключванията на конеца, тованамалява броя на придобиванията на брави. Този подход обикновено води до повишаване на производителността на приложението. Вижте кода по-долу, за да видите как се прави.

конвертирате двоичен файл в int java
// Мързелива инициализация с Double Lock публичен клас LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {синхронизиран (Launch) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Метод на мързеливо натоварване

Този метод се основава на JSL (Java Language Specification) и според него ще зареди статични членове на данни само когато са необходими. По този начин, когато вашият единичен клас се зарежда в JVM, не се създава екземпляр. Освен това, по време на изпълнението на програмата, глобалният метод се извиква в последователен ред. С този метод не е нужно да синхронизирате изрично статичния getInstance (), за да заредите и инициализирате. Статичният член на класа ще бъде извикан по правилен секвениран начин, останалите едновременни извиквания на глобалния метод се връщат в същия ред, без да се налага да се извършват режийни за синхронизация.

По-долу е даден кодът за извършване на същото.

// Метод на мързеливо зареждане публичен клас LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

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

Този метод за създаване на единичен клас в Java еподобен на нетърпеливия метод за инициализация. Единствената разлика е, че екземплярът за този клас се създава в статичния блок с функционалност.

// Инициализация на статичен блок публичен клас StaticBlockSingleton {частен статичен StaticBlockSingleton ИНСТАНЦИЯ private StaticBlockSingleton () {} // обработка на изключения в статичен блок static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {хвърли ново RuntimeException ('Изключение възникна докато създавате сингълтон клас ')}} публичен статичен StaticBlockSingleton getInstance () {return INSTANCE}}

Това ни води до края на тази статия за клас Singleton в Java. Ако искате да научите повече за Java, можете да се обърнете към нашата .

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

Имате въпрос към нас? Моля, споменете го в раздела за коментари на тази статия „Клас на Singleton в Java“ и ние ще се свържем с вас възможно най-скоро.