Introduzione alla classe Singleton in Java

La classe Singleton limita la creazione di oggetti per una classe a una sola nella macchina virtuale Java. Aiuta anche a fornire un punto di accesso globale all'oggetto. Questo modello di progettazione viene comunemente utilizzato nella memorizzazione nella cache, nella Fabbrica astratta, nella registrazione, nel prototipo, ecc. Viene anche utilizzato nelle classi java principali come java.awt.Desktop, java.lang.Runtime. In java.lang.Runtime, Java fornisce un runtime di classe che indica l'ambiente di runtime corrente in cui l'applicazione è in esecuzione. Questo aiuta a interfacciare l'applicazione e l'ambiente di runtime. Dovrebbe esserci un oggetto poiché JRE è unico. In java.awt.Desktop, class Desktop consente alle applicazioni di avviare un URI o un file con browser predefinito dell'utente, client di posta, ecc. Anche in questo caso deve esserci solo un'istanza della classe.

Come funziona la classe Singleton in Java

La classe Singleton può essere creata in due modi.

  1. Impostare il costruttore come privato per limitare la creazione di un oggetto.
  2. Crea un metodo statico per ottenere un'istanza dell'oggetto, in modo da poter gestire la creazione dell'oggetto solo all'interno della classe.

Vediamo ora il diagramma Classe UML (Unified Modeling Language) della classe Singleton.

Nel diagramma UML della classe, la prima partizione rappresenta il nome di una classe, la seconda partizione rappresenta gli attributi e la terza partizione rappresenta i metodi. Inoltre, + indica attributi o metodi pubblici e - indica attributi o metodi privati. Nel nostro diagramma UML della classe Singleton, il nome della classe è Singleton e ha un metodo principale. Metodo principale, metodo getInstance e sampleMethod sono gli unici metodi pubblici nel diagramma sopra. L'attributo costruttore e istanza è impostato come privato nell'ambito della nostra implementazione. Questo metodo principale pubblico richiede l'istanza e getInstance la restituisce al metodo principale.

Sulla base di Instantiation, l'unica differenza tra la normale Classe Java e la Classe Singleton è che useremo un costruttore in Java Class mentre, a Singleton, useremo il metodo getInstance ().

Il modello di progettazione Singleton ha due forme.

  • Lazy Instantiation: creazione dell'istanza quando richiesto
  • Istantanea anticipata: creazione dell'istanza al momento del caricamento.

1. Istantanea pigra

In Lazy Instantiation, un'istanza di classe viene creata quando è richiesta. Viene creato nel metodo o blocco sincronizzato per evitare le condizioni di competizione che possono verificarsi in un ambiente multi-thread.

2. Istantanea precoce

Nella prima istanza, viene creata un'istanza al momento del caricamento. Anche se questo è l'approccio più semplice, ha uno svantaggio che la creazione dell'istanza è indipendente dal fatto che si acceda o meno.

Un esempio di Lazy Instantiation e Early Instantiation è spiegato nella sezione seguente.

Implementazione della classe Singleton in Java

Come discusso in precedenza, la classe Singleton può essere creata in Instantiation o Lazy Instantiation.

Istantanea pigra

Di seguito sono riportati i passaggi per implementare la Lazy Instantiation

1. Impostare Costruttore come privato.

Ad esempio, stiamo creando una classe LazyClass. Il costruttore sarà come mostrato di seguito.

private LazyClass ()
(
)

2. Creare un'istanza statica privata per la classe creata.

private static LazyClass instance;

3. Creare un metodo sincronizzato statico per ottenere l'istanza della classe.

public static synchronized LazyClass getInstance()
(
)

4. Nel metodo getInstance (), verificare innanzitutto se è presente un'istanza. Se non trovato, creane uno. Altrimenti restituisce l'istanza.

if(instance == null)
(
instance = new LazyClass ();
)
return instance;

Ora, esaminiamolo usando il codice di esempio.

//Java Program for Lazy Instantiation
public class LazyClass (
private static LazyClass instance;
//set the constructor as private
private LazyClass () ()
//Checks whether an instance is already in the getInstance method
public static synchronized LazyClass getInstance() (
//if instance is not present already, create a new one
if(instance == null) (
instance = new LazyClass ();
)
// if an instance is present, then return it
return instance;
)
//Sample method that is protected from more than one object creation
public void sampleMethod( ) (
System.out.println("sampleMethod for lazy singleton");
)
public static void main(String() args) (
LazyClass temp=LazyClass.getInstance();
temp.sampleMethod();
)
)

Produzione:

Qui, invece di creare un'istanza al momento del caricamento, viene creata all'interno del blocco sincronizzato. Per una migliore comprensione, viene anche fornito un metodo di esempio che è protetto da più di una creazione di oggetti.

Istantanea precoce

Vediamo ora i passaggi per l'istantanea precoce. È simile all'istanza pigra, tranne per il fatto che non utilizza alcun metodo o blocco sincronizzato.

1. Impostare Costruttore come privato.

Ad esempio, stiamo creando una classe EarlyClass. Il costruttore sarà come mostrato di seguito.

private EarlyClass () ()
(
)

2. Creare un'istanza statica privata per la classe creata.

private static EarlyClass ins = new EarlyClass();

3. Creare un metodo statico per ottenere l'istanza della classe.

public static EarlyClass getInstance()
(
)

Di seguito è riportato il codice di esempio per l'istantanea precoce.

//Java Program for Early Instantiation
public class EarlyClass (
//Create an instance of the class at load time
private static EarlyClass ins = new EarlyClass();
//set the constructor as private
private EarlyClass () ()
//A static method to get the instance
public static EarlyClass getInstance() (
return ins ;
)
//A sample method that is protected from more than one object creation
public void sampleMethod() (
System. out .println("sampleMethod for Early singleton");
)
//Main method
public static void main(String() args) (
EarlyClass tmp = getInstance ();
tmp.sampleMethod();
)
)

Produzione:

Nel programma sopra, un'istanza viene creata in tempo di caricamento e viene restituita utilizzando il metodo getInstance (). Inoltre, Constructor è impostato come privato come parte dell'istanza singleton.

Il salvataggio della memoria è il principale vantaggio dell'utilizzo di questo oggetto come riutilizzo e non creazione ripetuta di un oggetto.

Conclusione

In questo documento, abbiamo spiegato come funziona una classe Singleton con l'aiuto del diagramma, dell'algoritmo e del codice di esempio della classe UML. La classe Singleton viene utilizzata quando è necessario un solo oggetto per una classe e un punto di accesso globale a tale oggetto. Le due forme come istanziazione precoce e istanziazione pigra possono essere utilizzate in base al requisito.

Articoli consigliati

Questa è una guida alla classe Singleton in Java. Qui discutiamo di come funziona la classe singleton in java insieme all'implementazione che include un'istanza pigra e un'istanza iniziale. Puoi anche consultare i nostri altri articoli suggeriti per saperne di più -

  1. Che cos'è Design Pattern in Java?
  2. Classe astratta in Java
  3. Annotazioni Java
  4. BorderLayout in Java
  5. JRE vs JVM | Le 8 principali differenze con (Infografica)
  6. Come lavorare il metodo statico in JavaScript?

Categoria: