Singleton Class in Java - Hoe Singleton Class te gebruiken?



Dit artikel over Singleton Class in Java gaat over de verschillende manieren waarop een klasse Singleton kan worden gemaakt, samen met praktische implementaties.

In Java is een singleton-klasse een klasse die slechts één instantie tegelijk kan hebben. Het is een van de vijf Creational Design-patronen in Java die helpt bij de moeiteloze ontwikkeling van . Door middel van dit artikel zal ik je duidelijke inzichten geven in wat een singleton-klasse in Java is en hoe je deze kunt maken.

Hieronder staan ​​de onderwerpen die ik in dit artikel zal behandelen:





Laten we beginnen.

Wat is een Singleton-klasse in Java?

In termen van de leek is een Singleton-klasse in Java de klasse die er toegang toe geeft via één instantie tegelijk. Dit ontwerppatroon is bedoeld om de onnodige instantiatie van een klasse te beperken en ervoor te zorgen dat er maar één bestaat op elk moment per JVM-instantie. Met dit patroon heeft elke klasse die is gedefinieerd als Singleton dus slechts één instantiemet een wereldwijd toegangspunt. In tegenstelling tot normale klassen, wordt een singleton-klasse niet vernietigd aan het einde van de levenscyclus van de toepassing.



Maar waarom hebben we überhaupt een Singleton Class nodig?

Welnu, door het maken van een instantie van een klasse te beperken, bespaart het geheugenruimte, omdat het object nu niet elke keer wordt gemaakt wanneer een nieuw verzoek wordt gedaan. In plaats daarvan wordt een enkel object herhaaldelijk gebruikt. Dit is de reden waarom het Singleton-patroon in Java meestal wordt gebruikt en databasetoepassingen. Het wordt in principe gebruikt voor logboekregistratie, caching, threadpooling, configuratie-instellingen en nog veel meer.

Ik hoop dat je duidelijk bent over het concept van Singleton-klasse in Java. Dus laten we hier nu verder in gaanSingleton Class in Java-artikel en kijk hoe ze zijn gemaakt.



Manieren om een ​​Java Singleton-klasse te ontwerpen

Om een ​​klasse singleton te maken in Java, heb je de volgende drie dingen nodig:

  1. statisch lid van een klasse
  2. particuliere constructeur
  3. statische fabrieksmethode

Omdat Java de ontwikkelaars hun horizon laat verkennen, zijn ereen aantal manieren waarop u een Singleton-klasse kunt ontwerpen. Hieronder heb ik de meest populaire opgesomd.

  1. Gretige initialisatiemethode
  2. Lazy Initialization Method
  3. Rijg de veilige Singleton-methode in
  4. Luie initialisatie met dubbele vergrendelingsmethode
  5. Lazy Load-methode
  6. Initialisatiemethode statische blokken

Laten we nu een voor een dieper ingaan op elk van deze benaderingen.

1. Gretige initialisatiemethode

Dit is de gemakkelijkste methode om een ​​Singleton-klasse te maken waarbij de instantie wordt gemaakt op het moment dat de klasse wordt geladen. Om met deze methode een singleton-klasse te maken, moet u de onderstaande stappen volgen:

  1. Declareer de constructor privé.
  2. De volgende stap is het maken van een privéleslid voor deze Singleton-klasse.
  3. Nu moet u een fabrieksmethode definiëren die zal worden gebruikt om het object van uw klasse te retourneren, dat we hebben gemaakt als een instantie van het klasselid.
  4. U kunt zelfs een statisch lid openbaar maken als u rechtstreeks toegang wilt tot deze statische instantie.

Laten we nu eens kijken hoe we deze kunnen implementeren.

// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = nieuwe EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Als u de code ziet, kunt u zien dat elke keer dat we een object instantiëren, we gebruik maken van degetInstance ()methode in plaats van de class aan te roepen bouwer .Maar het heeft zijn eigen nadelen. Als u deze methode gebruikt om een ​​klasse singleton te maken, wordt er een instantie gemaakt, ongeacht of de toepassing deze gebruikt of niet.

Laten we dus verder gaan en een andere manier bekijken om een ​​singleton-klasse in Java te maken.

2. Lazy Initialization Method

Deze methode wordt luie initialisatie genoemd omdat het het maken van de klasse-instantie uitstelt tot het eerste gebruik. Wat ik bedoel is dat met deze methode een object alleen wordt gemaakt als het nodig is. Het helpt bij het voorkomen van onnodige creatie van de . Om op deze manier een singleton-klasse te ontwerpen, moet u de onderstaande stappen volgen:

  1. Geef allereerst de constructor aan als privé.
  2. Vervolgens moet u een privé statische instantie voor deze klasse maken, maar u hoeft deze nog niet te instantiëren.
  3. Maak ten slotte een fabrieksmethode die eerst controleert of het subsysteemlid null is of niet. Als dit niet het geval is, wordt een instantie van de singleton-klasse voor u gemaakt en geretourneerd.

Onderstaande code laat zien hoe u dit kunt doen.

// Lazy Initialization openbare klasse LazySingleton {privé statisch LazySingleton INSTANCE = null privé LazySingleton () {} openbare statische LazySingleton getInstance () {if (INSTANCE == null) {gesynchroniseerd (LazySingleton.class) {INSTANCE = nieuwe LazySingleton ()}} terug INSTANCE}}

3. Rijg Safe Singleton in Methode

Maar de bovenstaande benadering kan enkele zorgen oproepen in de gelijktijdige scenario's. Omdat singleton-patroon voornamelijk wordt gebruikt met multi-threads en alsmeerdere threads voeren de if-voorwaarde in terwijl dit problemen kan veroorzaken. Om dit te voorkomen proberen we een threadveilige singleton-klasse te maken door de globale toegangsmethode te synchroniseren. Dit zorgt ervoor dat slechts één thread deze methode op elk moment uitvoert. Raadpleeg de onderstaande code om de implementatie te zien:

// Thread Safe Singleton openbare klasse ThreadSafeSingleton {privé statisch ThreadSafeSingleton INSTANCE privé ThreadSafeSingleton () {} openbaar statisch gesynchroniseerd ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = nieuw ThreadSafeSingleton ()} terugkeer INSTANCE}}

Maar soms kan deze benadering ook erg omslachtig worden, zoals elke keer de methodewordt aangeroepen, moet het wachten tot het slot wordt vrijgegeven voordat de methode het kan gebruiken. Dit resulteert in het vertragen van het proces en leidt ons naar de volgende benaderingLuie initialisatie met dubbele vergrendeling.

4. Luie initialisatie met dubbele vergrendeling Methode

Bij deze benadering synchroniseren we de methoden niet. In plaats daarvan omhullen we de code voor het maken van objecten in een gesynchroniseerd blok.Dat kun je zeggen door van tevoren de draadvergrendelingen te controlerenvermindert het aantal lock-acquisities. Deze aanpak resulteert meestal in het verbeteren van de prestaties van de applicatie. Bekijk de onderstaande code om te zien hoe het moet.

// Luie initialisatie met Double Lock openbare klasse LazyDoubleLockSingleton {privé statisch LazyDoubleLockSingleton INSTANCE = null privé LazyDoubleLockSingleton () {} openbare statische LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {gesynchroniseerd (LazyDoubleLockSingleton.class == null) {INSTANCE = nieuwe LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Lazy Load-methode

Deze methode is gebaseerd op JSL (Java Language Specification) en volgens deze laadt statische gegevensleden alleen wanneer ze vereist zijn. Dus wanneer uw singleton-klasse in de JVM wordt geladen, wordt er geen instantie gemaakt. Verder wordt tijdens de uitvoering van het programma de globale methode in sequentiële volgorde aangeroepen. Met deze methode hoeft u de statische getInstance () niet expliciet te synchroniseren om te laden en te initialiseren. Het statische klasse-lid wordt op de juiste volgorde aangeroepen, de rest van gelijktijdige aanroepen van de globale methode worden in dezelfde volgorde geretourneerd zonder dat de synchronisatie-overhead hoeft te worden uitgevoerd.

def __init__ python

Hieronder staat de code om hetzelfde uit te voeren.

// Lazy Load Method openbare klasse LazyLoadSingleton {privé LazyLoadSingleton () {} privé statische klasse SingletonClassHolder {statische laatste Var INSTANCE = nieuwe LazyLoadSingleton ()} openbare statische LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Initialisatiemethode statische blokken

Deze methode voor het maken van een singleton-klasse in Java isvergelijkbaar met enthousiaste initialisatiemethode. Het enige verschil is dat de instantie voor deze klasse wordt gemaakt binnen het statische blok met functionaliteit.

// Initialisatie statisch blok openbare klasse StaticBlockSingleton {privé statisch StaticBlockSingleton INSTANCE privé StaticBlockSingleton () {} // Afhandeling van uitzonderingen binnen statisch blok statisch {probeer {INSTANCE = nieuw StaticBlockSingleton ()} vangst (uitzondering e) {gooi nieuwe RuntimeException ('Uitzondering opgetreden tijdens het maken van een Singleton Class ')}} openbare statische StaticBlockSingleton getInstance () {return INSTANCE}}

Dit brengt ons bij het einde van dit artikel over de Singleton-klasse in Java. Als u meer wilt weten over Java, kunt u onze .

Nu je hebt begrepen wat een Singleton-klasse in Java is, kun je het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. De training- en certificeringcursus Java J2EE en SOA van Edureka is bedoeld voor studenten en professionals die Java-ontwikkelaar willen worden. De cursus is bedoeld om u een voorsprong te geven in het programmeren van Java en u te trainen in zowel de kern als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het alstublieft in het commentaargedeelte van dit 'Singleton Class in Java' -artikel en we nemen zo snel mogelijk contact met u op.