Come creare Singleton in Java? Tipi di inizializzazione, confronto e punti da ricordare

Pubblicato: 2020-10-07

Una classe singleton in Java è definita come quella classe che ha un solo oggetto, cioè solo un'istanza della classe. La limitazione dell'istanza a una sola per classe aiuta a codificare programmi particolari che richiedono solo un'istanza della classe. All'unica istanza di una classe singleton viene assegnato un punto di accesso globale.

La classe Singleton è uno dei modelli di progettazione importanti nella programmazione Java. Le classi singleton aiutano a limitare le risorse e ad ottimizzarle; è molto utilizzato nelle connessioni o nei socket di database. Esistono sintassi di implementazione per la classe singleton e un buon sviluppatore deve conoscerlo. Vediamo l'implementazione della classe singleton in Java.

Impara i programmi per ingegneri del software online dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.

Leggi: Spiegazione dell'architettura e dei componenti Java

Sommario

Inizializzazione

L'inizializzazione di un singleton in Java avviene tramite un costruttore privato. I costruttori privati ​​aiutano in altre classi a non essere in grado di creare la stessa istanza della tua classe singleton. Esistono cinque tipi di inizializzazione della classe singleton in Java, elencati di seguito:

1. Inizializzazione desiderosa

Viene creato un metodo pubblico comunemente denominato getInstance(). Questo metodo aiuterà a fornire un solo punto di ingresso per creare un'istanza della classe, rendendola così una classe singleton. L'istanza della classe nell'inizializzazione desiderosa viene creata al momento del caricamento della classe.

Questo tipo di tecnica di inizializzazione crea automaticamente l'istanza della classe, anche se l'utente non la sta utilizzando. Ciò potrebbe causare problemi di memoria e lunghezza non necessaria del codice. Per contrastare il problema della perdita di memoria, vediamo un altro tipo di tecnica di inizializzazione per una classe singleton in Java.

2. Inizializzazione pigra

L'istanza della classe viene inizializzata nel metodo getInstance() stesso nell'inizializzazione lazy. Il metodo nell'inizializzazione pigra verificherà se l'istanza della classe è stata creata o meno e se non viene creata, crea solo un'istanza, risolvendo così il problema della perdita di memoria.

Il metodo che si crea nell'inizializzazione pigra è statico e ha un oggetto di tipo restituito. L'istanza singleton nell'inizializzazione lazy non verrà creata fino a quando il metodo getInstance() non verrà chiamato per la prima volta.

3. Inizializzazione pigra con metodo Double Lock

Questo metodo viene utilizzato al momento di più di un thread. Se stiamo usando due thread nel programma, ed entrambi sono accessibili tramite l'istruzione 'if' all'inizio quando l'istanza è nulla, creerà una situazione di conflitto e potresti trovare errori.

Questo problema viene risolto dal metodo Double Lock in cui un solo thread alla volta entra nel blocco sincronizzato per l'inizializzazione dell'istanza mentre l'altro thread è bloccato. Quando il primo thread esce dal blocco sincronizzato, solo il secondo thread entra e crea un'altra istanza. Per impostazione predefinita, il secondo thread non verifica se l'istanza non è nulla o meno.

4. Metodo di carico pigro

La classe interna nidificata viene creata in questo metodo e funziona sui principi di JLS (Java Language Specifications). Non ci sarebbero membri di dati statici nella classe; JVM non creerà un'istanza della classe. L'istanza verrebbe creata solo su richiesta quando invochiamo il metodo getInstance().

Non è necessario sincronizzare il metodo per l'inizializzazione e il caricamento poiché questo metodo aiuta nella sincronizzazione automatica di tutte le chiamate di ottenere Instance().

5. Metodo Enum

È ancora possibile creare più istanze di una classe singleton mediante serializzazione e riflessione nei metodi precedenti. Nel caso di creare una classe singleton rigorosa, è possibile utilizzare questo metodo. I campi Enum vengono utilizzati in questo metodo che è una costante e viene eseguito solo in fase di compilazione.

Un Enum è l'istanza del tipo Enum e verrà costruito solo quando il tipo Enum viene invocato/chiamato per la prima volta nel codice. Questo metodo limita la clonazione dell'istanza e crea una classe singleton perfetta.

Leggi anche: I 12 migliori programmi di pattern in Java che dovresti controllare oggi

Serializzazione e riflessione

La serializzazione aiuta nel trasporto di oggetti Java da una JVM (Java Virtual Machine) a un'altra. La serializzazione è uno dei metodi utilizzati per creare più istanze di una classe. La serializzazione converte l'oggetto in un flusso di byte e quindi il trasferimento viene eseguito.

Il flusso di byte aiuta a ricreare l'oggetto in qualche altra JVM utilizzando il processo di deserializzazione. Aiuta più sistemi a comunicare e condividere oggetti tra loro. Aiuta nella sincronizzazione tra JVM poiché gli oggetti funzioneranno in diverse JVM.

Reflection è anche un metodo per clonare oggetti in Java. Reflection è un'API che ci aiuta a conoscere la classe di qualsiasi oggetto e metodo sconosciuto di quella particolare classe a cui è possibile accedere tramite l'oggetto. La riflessione è ampiamente utilizzata dai programmatori per modificare il comportamento di classi e metodi in fase di esecuzione.

I tre comandi principali utilizzati nella riflessione sono getClass() per conoscere la classe a cui appartiene l'oggetto, getConstructors() per ottenere i costruttori pubblici della classe dell'oggetto, getMethods() per conoscere i metodi pubblici della classe sotto osservazione.

Classe normale vs classe singleton

Una classe standard in Java usa i costruttori per inizializzarsi, mentre usiamo il metodo getInstance() per inizializzare una classe singleton. Possiamo anche usare lo stesso nome di classe e metodo. Creiamo prima un oggetto per le classi normali, quindi utilizziamo i suoi metodi e proprietà.

Al contrario, in una classe singleton, creiamo un'istanza utilizzando la proprietà statica della classe e, in qualsiasi punto del codice, quella particolare classe restituirà solo una singola istanza.

Oltre ai molti vantaggi delle classi singleton, ci sono anche alcune scappatoie come le classi singleton manomettono i metodi di test delle unità se gli oggetti e i metodi sono strettamente accoppiati. In tal caso dovrai dedicare una classe completamente funzionale a un singleton.

A volte le dipendenze nascoste vengono create anche dalla classe singleton, poiché il riferimento della classe singleton viene passato ad altri metodi e non è completamente trasparente, rendendo così difficile per i programmatori/sviluppatori tenere traccia dei metodi e delle classi. Si dovrebbero tenere a mente queste carenze prima di creare uno schema singleton e si dovrebbe cercare di minimizzarlo.

Punti per fare una classe singleton perfetta

1. I punti che dovrebbero essere focalizzati per creare una classe singleton perfetta sono i seguenti:

2. Se stai creando più thread in una classe singleton, assicurati che tutti i thread non debbano inizializzare la classe singleton contemporaneamente. Si dovrebbe provare a creare classi singleton thread-safe.

3. Rendi la tua classe singleton a prova di riflessione, modificando la visibilità del costruttore al pubblico in fase di esecuzione e assicurandoti che ci sia solo un'istanza di una particolare classe singleton.

4. Se sono presenti più thread, è possibile utilizzare un modificatore volatile che impedisce a un thread di esaminare lo stato inizializzato di altri thread. Un modificatore volatile funziona sulla relazione succede prima in cui la scrittura avviene in un thread prima che qualsiasi altro thread possa leggerlo.

Da leggere: interessanti idee per progetti Java per principianti

Conclusione

Le classi singleton vengono utilizzate per creare connessioni personalizzate al database o qualsiasi programma in cui si desidera controllare i metodi e le istanze della classe.

Se desideri migliorare le tue abilità Java, devi mettere le mani su questi progetti Java. Se sei interessato a saperne di più su Java, sullo sviluppo dello stack completo, dai un'occhiata al programma Executive PG di upGrad e IIIT-B in sviluppo software - Specializzazione nello sviluppo dello stack completo , progettato per i professionisti che lavorano e offre oltre 500 ore di formazione rigorosa, 9 + progetti e incarichi, stato di Alumni IIIT-B, progetti pratici pratici e assistenza sul lavoro con le migliori aziende.

Diventa uno sviluppatore full stack

Richiedi la Laurea Magistrale in Informatica