Trieda Singleton v jazyku Java - Ako používať triedu Singleton?



Tento článok o triede Singleton Class v Jave hovorí o rôznych spôsoboch, ako je možné vytvoriť triedu Singleton, spolu s praktickými implementáciami.

V Jave je trieda singleton trieda, ktorá môže mať v danom čase iba jednu inštanciu. Je to jeden z piatich vzorov Creational Design v Jave, ktorý pomáha pri ľahkom vývoji . Prostredníctvom tohto článku vám poskytnem jasné informácie o tom, čo je trieda singleton v jazyku Java a ako ju môžete vytvoriť.

Ďalej uvádzam témy, ktorým sa budem v tomto článku venovať:





Začnime.

Čo je to Singleton Class v Jave?

Laicky povedané, trieda Singleton v Jave je trieda, ktorá k nej umožňuje prístup prostredníctvom jednej inštancie naraz. Tento návrhový vzor slúži na obmedzenie zbytočného vytvárania inštancií triedy a na zabezpečenie iba jednej existuje v každom okamihu na jednu inštanciu JVM. S týmto vzorom teda má každá trieda, ktorá je definovaná ako Singleton, iba jednu inštancius globálnym prístupovým bodom. Na rozdiel od bežných tried nie je trieda singleton do konca životného cyklu aplikácií zničená.



Prečo však vôbec potrebujeme Singleton Class?

Obmedzením vytvárania inštancií triedy tak šetrí miesto v pamäti, pretože objekt sa nevytvorí pri každej novej požiadavke. Namiesto toho sa jeden objekt použije opakovane. Z tohto dôvodu sa väčšinou používa vzor Singleton v Jave a databázové aplikácie. V zásade sa používa na protokolovanie, ukladanie do pamäte cache, združovanie vlákien, konfiguračné nastavenia a mnoho ďalších.

Dúfam, že máte jasno v koncepcii triedy Singleton v Jave. Poďme teda v tomto pokračovaťČlánok Singleton Class in Java a pozrite sa, ako sú vytvorené.



Spôsoby navrhovania triedy Java Singleton

Ak chcete vytvoriť triedu singleton v jazyku Java, potrebujete nasledujúce tri veci:

statická členská funkcia c ++
  1. statický člen triedy
  2. súkromný konštruktér
  3. statická továrenská metóda

Pretože Java umožňuje vývojárom skúmať ich obzory, existujúniekoľko spôsobov, ako môžete navrhnúť triedu Singleton. Ďalej uvádzam najpopulárnejšie.

  1. Metóda inicializácie dychtenia
  2. Lenivá metóda inicializácie
  3. Metóda bezpečného vlákna Singleton
  4. Lenivá inicializácia pomocou metódy dvojitého zámku
  5. Lazy Load Method
  6. Metóda inicializácie statického bloku

Poďme sa teraz po jednom ponoriť hlbšie do každého z týchto prístupov.

1. Metóda inicializácie dychtenia

Toto je najjednoduchší spôsob vytvorenia triedy Singleton, kde sa inštancia vytvára v čase načítania triedy. Ak chcete vytvoriť triedu singleton pomocou tejto metódy, musíte postupovať podľa nasledujúcich krokov:

  1. Vyhláste konštruktéra za súkromného.
  2. Ďalším krokom je vytvorenie člena súkromnej triedy pre túto triedu Singleton.
  3. Teraz musíte definovať továrenskú metódu, ktorá sa použije na vrátenie objektu vašej triedy, ktorý sme vytvorili ako inštanciu člena triedy.
  4. Statický člen môžete dokonca vyhlásiť za verejný, ak chcete získať priamy prístup k tejto statickej inštancii.

Teraz sa pozrime, ako ich implementovať.

// Inicializácia Eager public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Ak vidíte kód, môžete pozorovať, že zakaždým, keď vytvárame inštanciu objektu, ktorý využívamegetInstance ()skôr ako vyvolanie triedy staviteľ .Má to však svoje vlastné nevýhody. Ak použijete túto metódu na vytvorenie jediného triedy, potom by sa vytvorila inštancia bez ohľadu na to, či ju aplikácia používa alebo nie.

maximálna halda implementácia v jave

Poďme teda ďalej a pozrime sa na ďalší spôsob, ako vytvoriť triedu singleton v prostredí Java.

2. Lenivá metóda inicializácie

Táto metóda sa nazýva lenivá inicializácia, pretože odďaľuje vytvorenie inštancie triedy až do jej prvého použitia. Mám na mysli to, že pomocou tejto metódy sa objekt vytvorí, iba ak je to potrebné. Pomáha predchádzať zbytočnému vytváraniu súboru . Ak chcete navrhnúť triedu singleton týmto spôsobom, musíte postupovať podľa nasledujúcich krokov:

  1. Najskôr vyhláste konštruktora za súkromný.
  2. Potom musíte pre túto triedu vytvoriť súkromnú statickú inštanciu, ale nie je potrebné ju ešte inštancovať.
  3. Nakoniec vytvorte továrenskú metódu, ktorá najskôr skontroluje, či je člen inštancie nulový alebo nie. Ak nie, vytvorí pre vás inštanciu triedy singleton a vráti ju.

Nižšie uvedený kód ukazuje, ako to vykonať.

// 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 ()}} spiatočný INSTANCE}}

3. Thread Safe Singleton Metóda

Vyššie uvedený prístup však môže vyvolať určité obavy v súbežných scenároch. Pretože singletonový vzor sa používa hlavne s viacvláknovými vláknami a akViaceré vlákna vstupujú do podmienky if súčasne, čo môže spôsobiť problémy. Aby sme tomu zabránili, pokúsime sa vytvoriť triedu singletonu bezpečnú pre vlákna synchronizáciou globálnej prístupovej metódy. To zaisťuje, že túto metódu vykonáva v ktoromkoľvek okamihu iba jedno vlákno. Implementáciu nájdete v nasledujúcom kóde:

// Thread Safe Singleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public static synchronized ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE

Ale niekedy sa tento prístup môže stať veľmi ťažkopádnym ako pri každej metódeje vyvolaná, musí čakať na uvoľnenie zámku skôr, ako ho bude môcť metóda použiť. To má za následok spomalenie procesu a to nás vedie k ďalšiemu prístupuLenivá inicializácia s Double Lock.

v pythone je metóda __init__ triedy zvyknutá

4. Lenivá inicializácia s Double Lock Metóda

V tomto prístupe metódy nesynchronizujeme. Namiesto toho obklopíme kód na vytvorenie objektu v synchronizovanom bloku.Môžete povedať, že predbežnou kontrolou zámkov nití to môžete urobiťznižuje počet akvizícií zámkov. Tento prístup zvyčajne vedie k zvýšeniu výkonu aplikácie. Pozrite sa na nasledujúci kód a zistite, ako sa to deje.

// Lazy Initialization with Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDoubleLockSingleton = null) {INSTANCE = new LazyDoubleLockSingleton ()}}} vrátiť INSTANCE}}

5. Metóda lenivého zaťaženia

Táto metóda je založená na JSL (Java Language Specification) a podľa toho načíta členov statických údajov iba v prípade, že sú požadované. Keď je teda vaša trieda singleton načítaná do JVM, nie je vytvorená žiadna inštancia. Ďalej sa počas vykonávania programu globálna metóda vyvoláva v postupnom poradí. S touto metódou nemusíte explicitne synchronizovať statickú funkciu getInstance (), aby ste ju mohli načítať a inicializovať. Člen statickej triedy bude vyvolaný správnym sekvenčným spôsobom, zvyšok súbežných vyvolávaní globálnej metódy sa vráti v rovnakom poradí bez nutnosti vykonávania réžie synchronizácie.

Nižšie je uvedený kód, ktorý umožňuje rovnaké vykonávanie.

// Lazy Load Method public class LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Metóda inicializácie statického bloku

Táto metóda vytvorenia singleton triedy v Jave jepodobne ako nedočkavá metóda inicializácie. Jediný rozdiel je v tom, že inštancia pre túto triedu sa vytvára v statickom bloku s funkčnosť.

// Inicializácia statického bloku verejná trieda StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // spracovanie výnimiek v rámci statického bloku static {try {INSTANCE = new StaticBlockSingleton ()} catch (Výnimka e) {vyvolať novú RuntimeException ('Vyskytla sa výnimka pri vytváraní Singleton Class ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

Týmto sa dostávame na koniec tohto článku o triede Singleton v Jave. Ak sa chcete dozvedieť viac informácií o prostredí Java, môžete sa obrátiť na našu stránku .

Teraz, keď ste pochopili, čo je trieda Singleton v Jave, pozrite sa na autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je určený pre študentov a profesionálov, ktorí chcú byť vývojármi Java. Kurz je navrhnutý tak, aby vám dal náskok v programovaní v Jave a naučil vás základné aj pokročilé koncepty Javy spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to, prosím, v sekcii komentárov v tomto článku „Singleton Class in Java“ a my sa vám ozveme čo najskôr.