Singletoni klass Java-s - kuidas kasutada Singletoni klassi?



See artikkel Singletoni klassi kohta Java-s räägib erinevatest viisidest, kuidas klassi saab Singletoniks teha, koos praktiliste rakendustega.

Javas on singletoni klass klass, millel võib antud ajahetkel olla ainult üks eksemplar. See on üks Java viiest loomekujunduse mustrist, mis aitab hõlpsasti välja töötada . Selle artikli vahendusel annan teile selge ülevaate selle kohta, mis on Java üksikklass ja kuidas saate seda luua.

Allpool on teemad, mida selles artiklis käsitlen:





Alustame.

Mis on Java Singletoni klass?

Maakeeli öeldes on Java Singletoni klass klass, mis võimaldab sellele juurdepääsu ühe eksemplari kaudu korraga. See kujundusmuster on klassi mittevajaliku eksponeerimise piiramiseks ja ainult ühe tagamiseks eksisteerib igal JVM-i eksemplari ajahetkel. Seega on selle mustri järgi igal klassil, mida määratletakse kui Singletonit, ainult üks eksemplarsellele ülemaailmse juurdepääsupunktiga. Erinevalt tavalistest klassidest ei hävitata üksikute klasside rakenduste elutsükli lõpuks.



Kuid miks on meil üldse vaja Singletoni klassi?

Noh, klassi eksemplari loomise piiramine säästab mäluruumi, kuna nüüd ei looda objekti iga kord, kui uus taotlus esitatakse. Selle asemel kasutatakse üksikut objekti korduvalt. See on põhjus, miks Java Singletoni mustrit enamasti kasutatakse ja andmebaasirakendused. Põhimõtteliselt kasutatakse seda logimiseks, vahemällu salvestamiseks, lõime koondamiseks, seadistusseadistusteks ja paljuks muuks.

Loodan, et teil on Java-keeles Singletoni klassi mõiste selge. Niisiis, jätkame sellega edasiSingletoni klass Java-artiklis ja vaadake, kuidas need on loodud.



Java Singletoni klassi kujundamise viisid

Jaava klassi singleri tegemiseks vajate järgmist kolme asja:

  1. klassi staatiline liige
  2. eraehitaja
  3. staatiline tehase meetod

Kuna Java laseb arendajatel oma silmaringi uurida, on neid kamitmeid viise, kuidas saate kujundada Singletoni klassi. Allpool olen loetlenud kõige populaarsemad.

  1. Innukas initsialiseerimise meetod
  2. Laisk initsialiseerimise meetod
  3. Thread Safe Singletoni meetod
  4. Laisk initsialiseerimine topeltluku meetodiga
  5. Laiska koormuse meetod
  6. Staatilise ploki initsialiseerimise meetod

Sukeldume nüüd kõigisse nendesse lähenemistesse ükshaaval.

1. Innukas initsialiseerimise meetod

See on kõige lihtsam meetod Singletoni klassi loomiseks, kus eksemplar luuakse klassi laadimise ajal. Selle meetodi abil üksikklassi loomiseks peate järgima allpool nimetatud samme:

def __init __ (ise):
  1. Kuulutage konstruktor privaatseks.
  2. Järgmine samm on luua selle Singletoni klassi eraklassi liige.
  3. Nüüd peate määratlema tehase meetodi, mida kasutatakse teie klassi objekti tagastamiseks, mille oleme loonud klassi liikme eksemplarina.
  4. Võite staatilise liikme isegi avalikuks kuulutada, kui soovite sellele staatilisele eksemplarile otse juurde pääseda.

Vaatame, kuidas neid rakendada.

// Eageri initsialiseerimine avalik klass EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public staatiline EagerSingleton getInstance () {return INSTANCE}}

Kui näete koodi, võite jälgida, et iga kord, kui me rakendame objekti, mida me seda kasutamegetInstance ()klassi asemel ehitaja .Kuid sellel on omad miinused. Kui kasutate seda meetodit klassi singleti loomiseks, luuakse eksemplar olenemata sellest, kas rakendus seda kasutab või mitte.

Niisiis, liigume edasi ja näeme veel ühte viisi Java-üksikklassi loomiseks.

2. Laisk initsialiseerimise meetod

Seda meetodit nimetatakse laisaks initsialiseerimiseks, kuna see lükkab klassieksemplari loomise selle esmakordse kasutamiseni. Pean silmas seda, et selle meetodi abil luuakse objekt ainult siis, kui seda on vaja. See aitab vältida tarkvara tarbetut loomist . Sellisel viisil üksikklassi kujundamiseks peate järgima allpool loetletud samme:

  1. Esiteks kuulutage konstruktor privaatseks.
  2. Siis peate selle klassi jaoks looma privaatse staatilise eksemplari, kuid pole vaja seda veel instantsida.
  3. Lõpuks looge tehasemeetod, mis kontrollib kõigepealt, kas eksemplari liige on null või mitte. Kui ei, siis loob see teile üksikklassi eksemplari ja tagastab selle.

Koodi all on näidatud, kuidas seda teha.

// Lazy Initialization avalik klass LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public staatiline LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySing tagasi INSTANCE}}

3. Thread Safe Singleton Meetod

Kuid ülaltoodud lähenemisviis võib samaaegsetes stsenaariumides tekitada mõningaid probleeme. Kuna üksikmustrit kasutatakse peamiselt mitme niidiga ja kuimitu lõime sisestavad tingimuse if korraga, see võib tekitada probleeme. Selle vältimiseks proovime luua niidikindla üksikklassi, muutes globaalse juurdepääsu meetodi sünkroniseeritud. See tagab, et seda meetodit käivitab igal ajahetkel ainult üks lõim. Rakenduse nägemiseks vaadake allolevat koodi:

// Thread Safe Singletoni avalik klass ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public staatiline sünkroonitud ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()

Kuid kohati võib selline lähenemine muutuda ka väga tülikaks, nagu iga kord, kui meetodit kasutataksekäivitatakse, peab see enne meetodi kasutamist ootama, kuni lukk vabaneb. Selle tulemuseks on protsessi aeglustamine ja järgmise lähenemise viimineLaisk initsialiseerimine topeltlukuga.

4. Laisk initsialiseerimine topeltlukuga Meetod

Selles lähenemisviisis me meetodeid ei sünkroniseeri. Pigem ümbritseme objekti loomise koodi sünkroonitud plokis.Võite öelda, et kontrollides eelnevalt niidi lukke, siis seevähendab lukkude soetamise arvu. Selle lähenemisviisi tulemuseks on tavaliselt rakenduse jõudluse suurendamine. Vaadake allpool olevat koodi, et näha, kuidas seda tehakse.

// Lazy initsialiseerimine Double Lock avaliku klassi LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (Lazy null) {INSTANCE = uus LazyDoubleLockSingleton ()}}} tagastab INSTANCE}}

5. Laiska koormuse meetod

See meetod põhineb JSL-il (Java keele spetsifikatsioon) ja vastavalt sellele laadib staatilisi andmeliikmeid ainult siis, kui neid vajatakse. Seega, kui teie üksikklass laaditakse JVM-i, ei looda eksemplari. Lisaks rakendatakse programmi käivitamise ajal globaalset meetodit järjestuses. Selle meetodi abil ei pea laadimise ja lähtestamise jaoks staatilist getInstance () -i selgesõnaliselt sünkroonima. Staatilise klassi liiget kutsutakse õigesti järjestatud viisil, ülejäänud globaalse meetodi samaaegsed invotsioonid tagastatakse samas järjekorras, ilma et peaksite sünkroonimise üldkulusid teostama.

Allpool on kood sama toimimiseks.

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

6. Staatilise ploki initsialiseerimise meetod

See Java üksikklassi loomise meetod onsarnane innuka initsialiseerimismeetodiga. Ainus erinevus on see, et selle klassi eksemplar luuakse staatilises plokis, millel on funktsionaalsus.

// Static Block Initialization avalik klass StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // erandite käsitlemine staatilises plokis staatiline {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {thrown new RuntimeException ('Exception noticed Singletoni klassi loomise ajal ')}} avalik staatiline StaticBlockSingleton getInstance () {return INSTANCE}}

Nii jõuame selle Java Singletoni klassi käsitleva artikli lõpuni. Kui soovite Java kohta rohkem teada saada, võite pöörduda meie poole .

Nüüd, kui olete aru saanud, mis on Java Singletoni klass, vaadake järgmist Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik hõlmab üle 250 000 rahuloleva õppija, levinud üle kogu maailma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad. Kursus on loodud selleks, et anda teile Java programmeerimises edukas algus ja õpetada teid nii Java-põhiprogrammide kui ka edasijõudnute mõistete ning erinevate Java-raamistike, näiteks Hibernate & Spring, jaoks.

Kas teil on meile küsimus? Palun mainige seda selle artikli Singletoni klass Java-s kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.