Classe Singleton in Java - Come utilizzare la classe Singleton?

Questo articolo sulla classe Singleton in Java parla dei vari modi in cui una classe può essere resa Singleton insieme a implementazioni pratiche.

In Java, una classe singleton è una classe che può avere solo un'istanza alla volta. È uno dei cinque modelli di progettazione creazionale in Java che aiuta nello sviluppo senza sforzo di . Per mezzo di questo articolo, ti darò una visione chiara di cos'è una classe singleton in Java e di come puoi crearla.

Di seguito sono riportati gli argomenti che tratterò in questo articolo:





implementazione di liste collegate in c

Iniziamo.

Cos'è una classe Singleton in Java?

In parole povere, una classe Singleton in Java è la classe che consente l'accesso ad essa attraverso una singola istanza alla volta. Questo modello di progettazione serve a limitare la creazione di istanze non necessarie di una classe e assicurarne solo una esiste in qualsiasi momento per istanza JVM. Pertanto, con questo modello, qualsiasi classe definita come Singleton ha solo una singola istanzacon un punto di accesso globale ad esso. A differenza delle classi normali, una classe singleton non viene distrutta entro la fine del ciclo di vita dell'applicazione.



Ma perché abbiamo bisogno di una classe Singleton in primo luogo?

Ebbene, limitando la creazione dell'istanza di una classe si risparmia spazio di memoria poiché ora l'oggetto non verrà creato ogni volta che viene effettuata una nuova richiesta. Invece, un singolo oggetto verrà utilizzato ripetutamente. Questo è il motivo per cui il pattern Singleton in Java viene utilizzato principalmente con e applicazioni di database. Fondamentalmente è utilizzato per la registrazione, la memorizzazione nella cache, il pool di thread, le impostazioni di configurazione e molti altri.

Spero che tu sia chiaro con il concetto di classe Singleton in Java. Quindi, procediamo ora oltre in questoSingleton Class in Java articolo e guarda come vengono creati.



Modi per progettare una classe singleton Java

Per creare una classe singleton in Java, sono necessarie le seguenti tre cose:

  1. membro statico di una classe
  2. costruttore privato
  3. metodo di fabbrica statico

Poiché Java consente agli sviluppatori di esplorare i propri orizzonti, ci sonodiversi modi in cui puoi progettare una classe Singleton. Di seguito ho elencato i più popolari.

  1. Metodo di inizializzazione desideroso
  2. Metodo di inizializzazione pigro
  3. Metodo Singleton thread-safe
  4. Inizializzazione pigra con metodo Double Lock
  5. Metodo di caricamento lento
  6. Metodo di inizializzazione del blocco statico

Vediamo ora di approfondire ciascuno di questi approcci uno per uno.

1. Metodo di inizializzazione desideroso

Questo è il metodo più semplice per creare una classe Singleton in cui l'istanza viene creata al momento del caricamento della classe. Per creare una classe singleton utilizzando questo metodo, è necessario seguire i passaggi indicati di seguito:

  1. Dichiara il costruttore privato.
  2. Il passaggio successivo consiste nel creare un membro della classe privata per questa classe Singleton.
  3. Ora, devi definire un metodo factory che verrà utilizzato per restituire l'oggetto della tua classe, che abbiamo creato come istanza del membro della classe.
  4. Puoi anche dichiarare pubblico un membro statico se desideri accedere direttamente a questa istanza statica.

Ora vediamo come implementarli.

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

Se vedi il codice, puoi osservare che ogni volta che creiamo un'istanza di un oggetto utilizziamo il filegetInstance ()metodo piuttosto che invocare la classe costruttore .Ma ha i suoi svantaggi. Se si utilizza questo metodo per creare una classe singleton, verrà creata un'istanza indipendentemente dal fatto che l'applicazione la stia utilizzando o meno.

Quindi, andiamo avanti e vediamo un altro modo di creare una classe singleton in Java.

2. Metodo di inizializzazione pigro

Questo metodo è chiamato inizializzazione pigra perché posticipa la creazione dell'istanza di classe fino al suo primo utilizzo. Quello che voglio dire è che, con questo metodo, un oggetto viene creato solo se è necessario. Aiuta a evitare la creazione non necessaria del file . Per progettare una classe singleton in questo modo, è necessario seguire i passaggi elencati di seguito:

come inizializzare una classe in python
  1. Prima di tutto, dichiara il costruttore come privato.
  2. Quindi è necessario creare un'istanza statica privata per questa classe ma non è ancora necessario crearne un'istanza.
  3. Infine, crea un metodo factory che verificherà prima se il membro dell'istanza è nullo o meno. In caso contrario, creerà un'istanza della classe singleton e la restituirà.

Il codice seguente mostra come eseguire questa operazione.

// 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 ()}} return INSTANCE}}

3. Singleton thread-safe Metodo

Ma l'approccio di cui sopra può sollevare alcune preoccupazioni negli scenari simultanei. Poiché il pattern singleton viene utilizzato principalmente con multi-thread e ifpiù thread entrano nella condizione if contemporaneamente che possono sollevare problemi. Per evitare ciò, proviamo a creare una classe singleton thread-safe sincronizzando il metodo di accesso globale. Ciò garantisce che un solo thread stia eseguendo questo metodo in qualsiasi momento. Fare riferimento al codice seguente per vedere l'implementazione:

come installare hadoop in linux
// ThreadSafeSingleton statico privato ThreadSafeSingleton INSTANCE privato ThreadSafeSingleton () {} ThreadSafeSingleton sincronizzato statico pubblico getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

Ma a volte questo approccio può anche diventare molto macchinoso come ogni volta che il metodoviene invocato, deve attendere che il blocco venga rilasciato prima che il metodo possa utilizzarlo. Ciò si traduce nel rallentare il processo e nel portarci al prossimo approccio che èInizializzazione pigra con Double Lock.

4. Inizializzazione pigra con Double Lock Metodo

In questo approccio, non sincronizziamo i metodi. Piuttosto avvolgiamo il codice di creazione dell'oggetto all'interno di un blocco sincronizzato.Puoi dirlo controllando in anticipo i thread lockriduce il numero di acquisizioni di blocco. Questo approccio di solito si traduce nel potenziamento delle prestazioni dell'applicazione. Controlla il codice sottostante per vedere come è fatto.

// Lazy Initialization con Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDoubleLockSingleton.class = if (INSTANCE) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Metodo di caricamento lento

Questo metodo è basato su JSL (Java Language Specification) e in base a questo caricherà i membri dei dati statici solo quando sono richiesti. Pertanto, quando la tua classe singleton viene caricata nella JVM, non viene creata alcuna istanza. Inoltre, durante l'esecuzione del programma, il metodo globale viene richiamato in ordine sequenziale. Con questo metodo, non è necessario sincronizzare esplicitamente il getInstance () statico per caricare e inizializzare. Il membro della classe statica verrà richiamato in modo sequenziale appropriato, il resto delle chiamate simultanee del metodo globale viene restituito nello stesso ordine senza dover eseguire l'overhead di sincronizzazione.

Di seguito è riportato il codice per eseguire lo stesso.

// 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. Metodo di inizializzazione del blocco statico

Questo metodo per creare una classe singleton in Java èsimile al metodo di inizializzazione desideroso. L'unica differenza è che l'istanza per questa classe viene creata all'interno del blocco statico avente funzionalità.

// Static Block Initialization public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // gestione delle eccezioni all'interno del blocco statico static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Exception occured durante la creazione di una classe Singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

Questo ci porta alla fine di questo articolo sulla classe Singleton in Java. Se vuoi saperne di più su Java puoi fare riferimento al nostro .

Ora che hai capito cos'è una classe Singleton in Java, controlla il file da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per studenti e professionisti che desiderano diventare sviluppatori Java. Il corso è progettato per darti un vantaggio nella programmazione Java e formarti per concetti Java sia di base che avanzati insieme a vari framework Java come Hibernate e Spring.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo articolo 'Classe Singleton in Java' e ti risponderemo il prima possibile.