A Java, una classe singleton és una classe que només pot tenir una instància en un moment determinat. És un dels cinc patrons de disseny creatiu de Java que ajuda al desenvolupament sense esforç de . Mitjançant aquest article, us donaré informació clara sobre què és una classe individual a Java i com es pot crear.
A continuació es detallen els temes que tractaré en aquest article:
Comencem.
Què és una classe Singleton a Java?
En termes simples, una classe de Singleton a Java és la classe que permet accedir-hi mitjançant una única instància a la vegada. Aquest patró de disseny serveix per restringir la instanciació innecessària d'una classe i garantir-ne només una existeix en qualsevol moment del moment per cada instància de JVM. Així, amb aquest patró, qualsevol classe que es defineixi com a Singleton només té una única instànciaamb un punt d’accés global a la mateixa. A diferència de les classes normals, una classe individual no es destrueix al final del cicle de vida de les aplicacions.
Però, per què necessitem una classe Singleton en primer lloc?
Bé, en restringir la creació d’instàncies d’una classe, s’estalvia espai de memòria, ja que ara l’objecte no es crearà cada vegada que es faci una nova sol·licitud. En lloc d'això, s'utilitzarà un sol objecte repetidament. Aquest és el motiu pel qual s’utilitza principalment el patró Singleton a Java i aplicacions de bases de dades. S'utilitza bàsicament per al registre, la memòria cau, l'agrupació de fils, els paràmetres de configuració i molts més.
Espero que tingueu clar el concepte de classe Singleton a Java. Per tant, anem ara en aquest sentitArticle de la classe Singleton a Java i vegeu com es creen.
Maneres de dissenyar una classe Java Singleton
Per fer un singleton de classe a Java, necessiteu les tres coses següents:
com analitzar XML a Java
- membre estàtic d'una classe
- constructor privat
- mètode estàtic de fàbrica
Com que Java permet als desenvolupadors explorar els seus horitzons, n’hi hadiverses maneres de dissenyar una classe de Singleton. A continuació he enumerat els més populars.
- Mètode d'inicialització desitjós
- Mètode d'inicialització mandrós
- Mètode Thread Safe Singleton
- Inicialització mandrosa amb mètode de doble bloqueig
- Mètode de càrrega mandrosa
- Mètode d'inicialització de blocs estàtics
Aprofundim ara en cadascun d’aquests plantejaments un per un.
1. Mètode d'inicialització desitjós
Aquest és el mètode més senzill de crear una classe Singleton on es crea la instància en el moment de carregar la classe. Per crear una classe de singleton mitjançant aquest mètode, heu de seguir els passos esmentats a continuació:
- Declareu el constructor com a privat.
- El següent pas és crear un membre de classe privada per a aquesta classe de Singleton.
- Ara heu de definir un mètode de fàbrica que s’utilitzarà per retornar l’objecte de la vostra classe, que hem creat com a instància del membre de la classe.
- Fins i tot podeu declarar públic un membre estàtic si voleu accedir directament a aquesta instància estàtica.
Ara, vegem com implementar-los.
// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}
Si veieu el codi, podeu observar que cada vegada que instanciem un objecte fem servir el fitxergetInstance ()mètode en lloc d'invocar la classe constructor .Però té els seus propis desavantatges. Si utilitzeu aquest mètode per crear un singleton de classe, es crearia una instància independentment del fet que l’aplicació l’utilitzi o no.
classe de pojo a Java amb exemple
Per tant, avancem i veurem una altra manera de crear una classe de singleton a Java.
2. Mètode d'inicialització mandrós
Aquest mètode s’anomena inicialització mandrosa perquè posposa la creació de la instància de classe fins al seu primer ús. El que vull dir és que, amb aquest mètode, es crea un objecte només si és necessari. Ajuda a evitar la creació innecessària del fitxer . Per dissenyar una classe individual d'aquesta manera, heu de seguir els passos següents:
- Primer de tot, declarar el constructor com a privat.
- A continuació, heu de crear una instància estàtica privada per a aquesta classe, però encara no cal instanciar-la.
- Finalment, creeu un mètode de fàbrica que primer comprovarà si el membre de la instància és nul o no. Si no, llavors us crearà una instància de la classe singleton i la retornareu.
A continuació, el codi mostra com fer-ho.
// 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 ()}} torna INSTANCE}}
3. Thread Safe Singleton Mètode
Però l'enfocament anterior pot suscitar algunes preocupacions en els escenaris concurrents. Atès que el patró singleton s'utilitza principalment amb multi-fils i sidiversos fils introdueixen la condició if al mateix temps que poden generar problemes. Per evitar-ho, intentem crear una classe singleton segura de fils mitjançant la sincronització del mètode d'accés global. Això garanteix que només un fil estigui executant aquest mètode en qualsevol moment. Consulteu el codi següent per veure la implementació:
// 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
Però, de vegades, aquest enfocament també pot esdevenir molt feixuc a mesura que es fa el mètodes'invoca, ha d'esperar que el bloqueig s'alliberi abans que el mètode el pugui utilitzar. Això es tradueix en una desacceleració del procés i ens condueix al següent enfocamentInicialització mandrosa amb doble bloqueig.
4. Inicialització mandrosa amb doble bloqueig Mètode
En aquest enfocament, no sincronitzem els mètodes. Més aviat, embolicem el codi de creació d'objectes dins d'un bloc sincronitzat.Podeu dir que comprovant prèviament els panys de fil, ho faredueix el nombre d'adquisicions de bloqueig. Aquest enfocament generalment té com a resultat augmentar el rendiment de l'aplicació. Consulteu el codi següent per veure com es fa.
// Lazy Initialization with Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDouble) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}
5. Mètode de càrrega mandrosa
Aquest mètode es basa en JSL (Java Language Specification) i segons això carregarà els membres de dades estàtiques només quan siguin necessaris. Així, quan la vostra classe de singleton es carrega a la JVM, no es crea cap instància. A més, durant l'execució del programa, s'invoca el mètode global en ordre seqüencial. Amb aquest mètode, no haureu de sincronitzar explícitament el getInstance estàtic () per carregar-lo i inicialitzar-lo. El membre de la classe estàtica s’invocarà de manera seqüenciada adequadament, la resta d’invocacions simultànies del mètode global es retornaran en el mateix ordre sense haver de realitzar la sobrecàrrega de sincronització.
A continuació es mostra el codi per realitzar el mateix.
// 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. Mètode d'inicialització de blocs estàtics
Aquest mètode per crear una classe de singleton a Java éssimilar al mètode d’inicialització ansiós. L'única diferència és que la instància d'aquesta classe es crea dins del bloc estàtic que té funcionalitat.
// Static Block Initialization public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // maneig de les excepcions dins del bloc estàtic static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Excepció ocorreguda) mentre es crea una classe Singleton ')}} pública estàtica StaticBlockSingleton getInstance () {return INSTANCE}}
Això ens porta al final d’aquest article sobre la classe de Singleton a Java. Si voleu saber més sobre Java, podeu consultar el nostre document .
Ara que heu entès què és una classe de Singleton a Java, consulteu el per Edureka, una empresa d'aprenentatge en línia de confiança amb una xarxa de més de 250.000 estudiants satisfets repartits per tot el món. El curs de formació i certificació Java J2EE i SOA d’Edureka està dissenyat per a estudiants i professionals que vulguin ser desenvolupador de Java. El curs està dissenyat per donar-vos un avantatge en la programació de Java i formar-vos tant per conceptes bàsics com avançats de Java, juntament amb diversos marcs Java com Hibernate i Spring
Tens alguna pregunta? Si us plau, mencioneu-lo a la secció de comentaris d'aquest article de 'Classes Singleton a Java' i us respondrem el més aviat possible.