Cum să faci Singleton în Java? Tipuri de inițializare, comparație și puncte de reținut
Publicat: 2020-10-07O clasă singleton în Java este definită ca acea clasă care are un singur obiect, adică o singură instanță a clasei. Restricționarea instanței la doar una pe clasă ajută la codificarea anumitor programe care necesită o singură instanță a clasei. Singura instanță a unei clase singleton are un punct de acces global.
Clasa Singleton este unul dintre modelele de design importante în programarea Java. Cursurile Singleton ajută la limitarea resurselor și optimizarea acestora; este folosit foarte mult în conexiunile la bazele de date sau în socket-uri. Există sintaxe de implementare pentru clasa singleton și un dezvoltator bun trebuie să știe despre aceasta. Să vedem implementarea clasei singleton în Java.
Învață programe de inginer software online de la cele mai bune universități din lume. Câștigă programe Executive PG, programe avansate de certificat sau programe de master pentru a-ți accelera cariera.
Citiți: Arhitectura Java și componentele explicate
Cuprins
Inițializare
Inițializarea unui singleton în Java se face printr-un constructor privat. Constructorii privați ajută în alte clase care nu pot crea aceeași instanță ca și clasa dvs. singleton. Există cinci tipuri de inițializare a clasei singleton în Java, care sunt enumerate mai jos:
1. Inițializare dornică
Este creată o metodă publică denumită în mod obișnuit getInstance(). Această metodă va ajuta la furnizarea unui singur punct de intrare pentru crearea unei instanțe a clasei, făcând astfel o clasă singleton. Instanța clasei în inițializare dornică este creată în momentul încărcării clasei.

Acest tip de tehnică de inițializare creează automat instanța clasei, chiar dacă utilizatorul nu o folosește. Acest lucru poate cauza probleme de memorie și lungime inutilă în cod. Pentru a contracara problema pierderii memoriei, să vedem un alt tip de tehnică de inițializare pentru o clasă singleton în Java.
2. Inițializarea leneșă
Instanța clasei este inițializată în metoda getInstance () însăși în inițializarea leneșă. Metoda în inițializarea leneșă va verifica dacă instanța clasei este sau nu creată și dacă nu este creată, atunci doar creează o instanță, rezolvând astfel problema pierderii memoriei.
Metoda creată în inițializarea leneșă este statică și are un obiect de tip return. Instanța singleton în inițializarea leneșă nu va fi creată până când metoda getInstance() nu este apelată pentru prima dată.
3. Inițializare leneșă cu metoda de blocare dublă
Această metodă este utilizată în timpul a mai multor fire. Dacă folosim două fire de execuție în program și ambele pot fi accesate prin instrucțiunea „if” la pornirea când instanța este nulă, va crea o situație de conflict și este posibil să găsiți erori.
Această problemă este rezolvată prin Metoda de blocare dublă în care doar un fir de execuție intră la un moment dat în blocul sincronizat pentru inițializarea instanței în timp ce celălalt thread este blocat. Când primul thread iese din blocul sincronizat, atunci doar al doilea thread intră și creează o altă instanță. În mod implicit, al doilea thread nu verifică dacă instanța este non-nulă sau nu.
4. Metoda de încărcare lenenă
Clasa interioară imbricată este creată în această metodă și funcționează pe principiile JLS (Java Language Specifications). Nu ar exista membri de date statice în clasă; JVM nu va crea o instanță a clasei. Instanța va fi creată numai la cerere atunci când invocăm metoda getInstance().
Nu trebuie să sincronizați metoda de inițializare și încărcare, deoarece această metodă ajută la sincronizarea automată a tuturor invocărilor de obținere a Instance().
5. Metoda Enums
Mai multe instanțe ale unei clase singleton pot fi încă create prin serializare și reflectare în metodele de mai sus. În cazul realizării unei clase singleton stricte, această metodă poate fi utilizată. Câmpurile Enums sunt folosite în această metodă, care este o constantă și rulează numai în timpul compilării.

O Enum este instanța tipului Enum și va fi construită numai atunci când tipul Enum este invocat/apelat pentru prima dată în cod. Această metodă restricționează clonarea instanței și face o clasă singleton perfectă.
Citiți și: Top 12 programe de modele în Java pe care ar trebui să le verificați astăzi
Serializare și reflecție
Serializarea ajută la transportul obiectelor Java de la o JVM (Java Virtual Machine) la alta. Serializarea este una dintre metodele utilizate pentru crearea mai multor instanțe ale unei clase. Serializarea transformă obiectul într-un flux de octeți și apoi transferul este finalizat.
Fluxul de octeți ajută la recrearea obiectului într-un alt JVM folosind procesul de deserializare. Ajută mai multe sisteme să comunice și să partajeze obiecte între ele. Ajută la sincronizarea JVM încrucișată, deoarece obiectele vor funcționa în diferite JVM-uri.
Reflecția este, de asemenea, o metodă de clonare a obiectelor în Java. Reflection este un API care ne ajută să cunoaștem clasa oricărui obiect necunoscut și metodele acelei clase care pot fi accesate prin intermediul obiectului. Reflection este utilizat pe scară largă de către programatori pentru a modifica comportamentul claselor și metodelor în timpul rulării.
Cele trei comenzi majore utilizate în reflectare sunt getClass() pentru a cunoaște clasa căreia îi aparține obiectul, getConstructors() pentru a obține constructorii publici ai clasei obiectului, getMethods() pentru a cunoaște metodele publice ale clasei sub observație.
Clasa Normală Vs Clasa Singleton
O clasă standard în Java folosește constructori pentru a se inițializa, în timp ce noi folosim metoda getInstance() pentru a inițializa o clasă singleton. De asemenea, putem folosi același nume de clasă și metodă. Mai întâi creăm un obiect pentru clasele normale și apoi folosim metodele și proprietățile acestuia.
În schimb, într-o clasă singleton, creăm o instanță folosind proprietatea statică a clasei și, în orice moment al codului, acea clasă particulară va returna doar o singură instanță.
Pe lângă multe avantaje ale claselor singleton, există și câteva lacune, cum ar fi metodele de testare unitară a modificării claselor singleton, dacă obiectele și metodele sunt strâns cuplate. În acest caz, va trebui să dedicați o clasă complet funcțională unui singleton.
Dependențe ascunse sunt create, uneori, de clasa singleton, deoarece referința clasei singleton este transmisă altor metode și nu este complet transparentă, făcând astfel dificil pentru programatori/dezvoltatori să țină evidența metodelor și claselor. Ar trebui să țineți cont de aceste deficiențe înainte de a crea un model singleton și ar trebui să încercați să-l minimizeze.
Puncte pentru a face o clasă singleton perfectă
1. Punctele care ar trebui concentrate pentru a face o clasă singleton perfectă sunt următoarele:
2. Dacă creați mai multe fire într-o clasă singleton, atunci asigurați-vă că toate firele de execuție nu ar trebui să inițializeze clasa singleton în același timp. Ar trebui să încercați să faceți clase singleton sigure pentru fire.

3. Faceți dovada reflectării clasei dvs. singleton, schimbând vizibilitatea constructorului pentru public în timpul rulării și asigurându-vă că există o singură instanță a oricărei clase singleton particulare.
4. Dacă există mai multe fire de execuție, puteți utiliza un modificator volatil care împiedică un fir de execuție să se uite la starea inițializată a altor fire de execuție. Un modificator volatil funcționează pe relația întâmplă-înainte în care scrierea are loc într-un fir înainte ca orice alt fir să îl poată citi.
Trebuie citit: Idei interesante de proiecte Java pentru începători
Concluzie
Clasele Singleton sunt folosite pentru a face conexiuni personalizate la baza de date sau la orice program în care doriți să controlați metodele și instanțele clasei.
Dacă doriți să vă îmbunătățiți abilitățile Java, trebuie să puneți mâna pe aceste proiecte Java. Dacă sunteți interesat să aflați mai multe despre Java, dezvoltarea stivă completă, consultați programul Executive PG în dezvoltare software de la upGrad și IIIT-B - Specializare în dezvoltare stivă completă, care este conceput pentru profesioniști care lucrează și oferă peste 500 de ore de formare riguroasă, 9 + proiecte și sarcini, statutul de absolvenți IIIT-B, proiecte practice practice și asistență pentru locuri de muncă cu firme de top.