În Java, o clasă singleton este o clasă care poate avea o singură instanță la un moment dat. Este unul dintre cele cinci modele de proiectare creațională din Java care ajută la dezvoltarea fără efort a . Prin intermediul acestui articol, vă voi oferi informații clare despre ce este o clasă singleton în Java și despre cum o puteți crea.
Mai jos sunt subiectele pe care le voi aborda în acest articol:
Să începem.
Ce este o clasă Singleton în Java?
În termeni simpli, o clasă Singleton în Java este clasa care permite accesul la aceasta printr-o singură instanță la un moment dat. Acest model de proiectare este destinat restricționării instanțierii inutile a unei clase și asigurării unei singure există în orice moment al fiecărei instanțe JVM. Astfel, cu acest model, orice clasă care este definită ca Singleton are doar o singură instanțăcu un punct de acces global la acesta. Spre deosebire de clasele normale, o clasă singleton nu este distrusă până la sfârșitul ciclului de viață al aplicațiilor.
Dar de ce avem nevoie de o clasă Singleton în primul rând?
Ei bine, restricționând crearea instanței unei clase, economisește spațiu de memorie, deoarece acum obiectul nu va fi creat de fiecare dată când se face o nouă solicitare. În schimb, un singur obiect va fi utilizat în mod repetat. Acesta este motivul pentru care modelul Singleton din Java este folosit în cea mai mare parte și aplicații de baze de date. Este utilizat în principiu pentru înregistrare, stocare în cache, grupare de fire, setări de configurare și multe altele.
Sper că ești clar cu conceptul de clasă Singleton în Java. Deci, să continuăm acum în acest sensArticol Singleton Class în Java și vedeți cum sunt create.
Modalități de a proiecta o clasă Java Singleton
Pentru a crea o singleton de clasă în Java, aveți nevoie de următoarele trei lucruri:
cum să devii un dezvoltator de tablouri
- membru static al unei clase
- constructor privat
- metoda fabricii statice
Deoarece Java permite dezvoltatorilor să-și exploreze orizonturile, existăo serie de moduri în care puteți proiecta o clasă Singleton. Mai jos am enumerat cele mai populare.
- Metoda de inițializare Eager
- Metoda de inițializare leneșă
- Thread Safe Singleton Method
- Inițializare leneșă cu metoda Double Lock
- Metoda Lazy Load
- Metoda de inițializare a blocului static
Să ne aruncăm mai adânc în fiecare dintre aceste abordări una câte una.
1. Metodă de inițializare dornică
Aceasta este cea mai ușoară metodă de creare a unei clase Singleton în care instanța este creată în momentul încărcării clasei. Pentru a crea o clasă single folosind această metodă, trebuie să urmați pașii de mai jos:
- Declarați constructorul privat.
- Următorul pas este să creați un membru al clasei private pentru această clasă Singleton.
- Acum, trebuie să definiți o metodă din fabrică care va fi utilizată pentru a returna obiectul clasei dvs., pe care l-am creat ca instanță a membrului clasei.
- Puteți chiar să declarați un membru static public dacă doriți să accesați direct această instanță statică.
Acum, să vedem cum să le implementăm.
// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}
Dacă vedeți codul, puteți observa că de fiecare dată când instanțiem un obiect pe care îl folosimgetInstance ()mai degrabă decât invocarea clasei constructor .Dar are propriile sale dezavantaje. Dacă utilizați această metodă pentru a crea o singleton de clasă, atunci ar fi creată o instanță, indiferent dacă aplicația o folosește sau nu.
cum să găsiți lungimea unui tablou în javascript
Deci, să mergem mai departe și să vedem un alt mod de a crea o clasă de singleton în Java.
2. Metoda de inițializare leneșă
Această metodă se numește inițializare leneșă, deoarece amână crearea instanței de clasă până la prima utilizare. Ceea ce vreau să spun este că, cu această metodă, un obiect este creat doar dacă este necesar. Ajută la evitarea creării inutile a . Pentru a proiecta o clasă singleton în acest fel, trebuie să urmați pașii de mai jos:
- În primul rând, declarați constructorul drept privat.
- Apoi, trebuie să creați o instanță statică privată pentru această clasă, dar nu este nevoie să o instanțiați încă.
- În cele din urmă, creați o metodă din fabrică care va verifica mai întâi dacă membrul instanței este nul sau nu. Dacă nu, atunci va crea o instanță a clasei singleton și o va returna.
Codul de mai jos arată cum să efectuați acest lucru.
// 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 ()}} returnează INSTANCE}}
3. Thread Safe Singleton Metodă
Dar abordarea de mai sus poate ridica unele îngrijorări în scenariile concurente. Deoarece modelul singleton este utilizat în principal cu mai multe fire și dacămai multe fire introduc condiția if în același timp poate ridica probleme. Pentru a evita acest lucru, încercăm să creăm o clasă singleton sigură prin fire, sincronizând metoda de acces global. Acest lucru asigură că doar un singur fir execută această metodă în orice moment. Consultați codul de mai jos pentru a vedea implementarea:
// Thread Safe Singleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public static sincronizat ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE
Dar, uneori, această abordare poate deveni, de asemenea, foarte greoaie ca de fiecare dată când metodaeste invocat, trebuie să aștepte ca blocarea să fie eliberată înainte ca metoda să o poată utiliza. Acest lucru are ca rezultat încetinirea procesului și ne conduce la următoarea abordareInițializare leneșă cu blocare dublă.
4. Inițializare leneșă cu blocare dublă Metodă
În această abordare, nu sincronizăm metodele. Mai degrabă învelim codul de creare a obiectului într-un bloc sincronizat.Puteți spune că, verificând în prealabil încuietorile firelor, acestareduce numărul achizițiilor de blocare. Această abordare are ca rezultat de obicei creșterea performanței aplicației. Consultați codul de mai jos pentru a vedea cum se face.
// Initializare Lazy cu clasa publica Double Lock LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDouble) nul) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}
5. Metoda Lazy Load
Această metodă se bazează pe JSL (Java Language Specification) și în conformitate cu aceasta va încărca membrii de date statice numai atunci când sunt solicitați. Astfel, atunci când clasa dvs. de singleton este încărcată în JVM, nu se creează nicio instanță. Mai mult, în timpul executării programului, metoda globală este invocată în ordine secvențială. Cu această metodă, nu trebuie să sincronizați explicit getInstance () static pentru a încărca și inițializa. Membruul clasei statice va fi invocat într-o manieră corectă secvențiată, restul invocațiilor concurente ale metodei globale sunt returnate în aceeași ordine fără a fi nevoie să efectuați suprascrierea de sincronizare.
Mai jos este codul pentru a efectua același lucru.
// 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. Metoda de inițializare a blocului static
Această metodă de creare a unei clase singleton în Java estesimilar cu metoda de inițializare dornică. Singura diferență este că instanța pentru această clasă este creată în cadrul blocului static având funcționalitate.
// Static Block Initialization public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // gestionarea excepțiilor în cadrul blocului static static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Excepție a avut loc în timp ce creați o clasă Singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}
Acest lucru ne aduce la sfârșitul acestui articol despre clasa Singleton în Java. Dacă doriți să aflați mai multe despre Java, vă puteți referi la .
Acum că ați înțeles ce este o clasă Singleton în Java, consultați de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Cursul de formare și certificare Java J2EE și SOA al Edureka este conceput pentru studenți și profesioniști care doresc să fie dezvoltator Java. Cursul este conceput pentru a vă oferi un început important în programarea Java și pentru a vă instrui atât pentru conceptele Java de bază, cât și pentru cele avansate, împreună cu diverse cadre Java, cum ar fi Hibernate & Spring
Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui articol „Singleton Class in Java” și vă vom contacta cât mai curând posibil.