Insieme immutabile in Java

1. Introduzione

In questo tutorial, daremo uno sguardo a diversi modi di costruire un set immutabile in Java.

Ma prima, capiamo l'insieme immutabile e vediamo perché ne abbiamo bisogno.

2. Che cos'è un set immutabile?

In generale, un oggetto immutabile non cambierà il suo stato interno una volta creato. Questo lo rende thread-safe per impostazione predefinita. La stessa logica si applica agli insiemi immutabili.

Supponiamo di avere un'istanza HashSet con alcuni valori. Rendendolo immutabile creerà una versione di "sola lettura" del nostro set. Pertanto, qualsiasi tentativo di modificare il suo stato genererà UnsupportedOperationException .

Allora, perché ne abbiamo bisogno?

Certamente, il caso d'uso più comune di un set immutabile è un ambiente multi-thread. Quindi, possiamo condividere dati immutabili tra i thread senza preoccuparci della sincronizzazione.

Nel frattempo, c'è un punto importante da tenere a mente: l' immutabilità riguarda solo il set e non i suoi elementi . Inoltre, possiamo modificare i riferimenti di istanza degli elementi dell'insieme senza problemi.

3. Creare insiemi immutabili in Core Java

Con solo le classi Java principali a nostra disposizione, possiamo usare le collezioni . unmodifiableSet () per eseguire il wrapping del set originale .

Innanzitutto, creiamo una semplice istanza di HashSet e inizializziamola con valori String :

Set set = new HashSet(); set.add("Canada"); set.add("USA");

Quindi, concludiamolo con le raccolte . unmodifiableSet ():

Set unmodifiableSet = Collections.unmodifiableSet(set);

Infine, per assicurarci che la nostra istanza unmodifiableSet sia immutabile, creiamo un semplice test case:

@Test(expected = UnsupportedOperationException.class) public void testUnmodifiableSet() { // create and initialize the set instance Set unmodifiableSet = Collections.unmodifiableSet(set); unmodifiableSet.add("Costa Rica"); }

Come previsto, il test verrà eseguito con successo. Inoltre, l' operazione add () è vietata sull'istanza unmodifiableSet e genererà UnsupportedOperationException .

Ora, cambiamo l' istanza del set iniziale aggiungendovi lo stesso valore:

set.add("Costa Rica");

In questo modo, modifichiamo indirettamente l'insieme non modificabile. Quindi, quando stampiamo l' istanza unmodifiableSet :

[Canada, USA, Costa Rica]

Come possiamo vedere, l' elemento "Costa Rica" è presente anche in unmodifiableSet.

4. Creare insiemi immutabili in Java 9

A partire da Java 9, il metodo factory statico Set.of (elements) è disponibile per creare insiemi immutabili:

Set immutable = Set.of("Canada", "USA");

5. Creare insiemi immutabili in Guava

Un altro modo in cui possiamo costruire un insieme immutabile è usare la classe ImmutableSet di Guava . Copia i dati esistenti in una nuova istanza immutabile. Di conseguenza, i dati all'interno di ImmutableSet non cambieranno quando modifichiamo il Set originale .

Come l'implementazione Java di base, qualsiasi tentativo di modificare l'istanza immutabile creata genererà UnsupportedOperationException .

Ora, esploriamo diversi modi per creare istanze immutabili.

5.1. Utilizzando ImmutableSet. copia di()

In poche parole, ImmutableSet . Il metodo copyOf () restituisce una copia di tutti gli elementi nel set:

Set immutable = ImmutableSet.copyOf(set);

Quindi, dopo aver modificato il set iniziale, l'istanza immutabile rimarrà la stessa:

[Canada, USA]

5.2. Utilizzo di ImmutableSet .of ()

Allo stesso modo, con il metodo ImmutableSet.of () possiamo creare istantaneamente un set immutabile con i valori dati:

Set immutable = ImmutableSet.of("Canada", "USA");

Quando non specifichiamo alcun elemento, ImmutableSet.of () restituirà un insieme immutabile vuoto.

Questo può essere paragonato al Set .of () di Java 9 .

6. Conclusione

In questo rapido articolo, abbiamo discusso dei set immutabili nel linguaggio Java. Inoltre, abbiamo mostrato come creare insiemi immutabili utilizzando l'API delle collezioni dal core Java, Java 9 e la libreria Guava.

Infine, come al solito, il codice completo di questo articolo è disponibile su GitHub.