Uforanderlig sett i Java

1. Introduksjon

I denne veiledningen, vi skal se på forskjellige måter å konstruere et uforanderlig sett på Java.

Men først, la oss forstå det uforanderlige settet og se hvorfor vi trenger det.

2. Hva er et uforanderlig sett?

Generelt, et uforanderlig objekt vil ikke endre sin interne tilstand når vi oppretter det. Dette gjør det trådsikkert som standard. Den samme logikken gjelder uforanderlige sett.

La oss anta at vi har en HashSet forekomst med noen verdier. Å gjøre det uforanderlig vil skape en "skrivebeskyttet" versjon av settet vårt. Og dermed, ethvert forsøk på å endre tilstanden vil kaste Ikke-støttetOperationException.

Så hvorfor trenger vi det?

Det vanligste bruksområdet for et uforanderlig sett er absolutt et miljø med flere tråder. Så vi kan dele uforanderlige data på tvers av trådene uten å bekymre oss for synkroniseringen.

I mellomtiden er det et viktig poeng å huske på: uforanderlighet gjelder bare settet og ikke dets elementer. Videre kan vi endre forekomstreferanser for settelementene uten problemer.

3. Lag uforanderlige sett i Core Java

Med bare de viktigste Java-klassene vi har til rådighet, kan vi bruke Samlinger.unmodifiableSet () metode for å pakke originalen Sett.

Først, la oss lage en enkel HashSet instans og initialiser den med String verdier:

Sett sett = nytt HashSet (); set.add ("Canada"); set.add ("USA");

Neste, la oss pakke det opp med Samlinger.unmodifiableSet ():

Set unmodifiableSet = Collections.unmodifiableSet (set);

Til slutt, for å sikre at vår umodifiserbarSett forekomst er uforanderlig, la oss lage en enkel testtilfelle:

@Test (forventet = UnsupportedOperationException.class) public void testUnmodifiableSet () {// opprett og initialiser settforekomsten Set unmodifiableSet = Collections.unmodifiableSet (set); unmodifiableSet.add ("Costa Rica"); }

Som vi forventer, vil testen kjøre vellykket. Videre er den legge til() drift er forbudt den det umodifiserbare settet forekomst og vil kaste Ikke-støttetOperationException.

La oss endre initialen sett forekomst ved å legge til den samme verdien til den:

set.add ("Costa Rica");

På denne måten endrer vi indirekte det umodifiserbare settet. Så når vi skriver ut umodifiserbarSett forekomst:

[Canada, USA, Costa Rica]

Som vi kan se, er “Costa Rica” elementet er også til stede i umodifiserbarSett.

4. Opprett uforanderlige sett i Java 9

Siden Java 9, den Set.of (elementer) statisk fabrikkmetode er tilgjengelig for å lage uforanderlige sett:

Sett uforanderlig = Set.of ("Canada", "USA");

5. Lag uforanderlige sett i Guava

En annen måte å konstruere et uforanderlig sett på er å bruke Guava ImmutableSet klasse. Den kopierer eksisterende data til en ny uforanderlig forekomst. Som et resultat, dataene inne ImmutableSet vil ikke endres når vi endrer originalen Sett.

I likhet med kjernen i Java-implementeringen, vil ethvert forsøk på å endre den opprettet uforanderlige forekomsten kaste Ikke-støttetOperationException.

La oss nå utforske forskjellige måter å skape uforanderlige forekomster på.

5.1. Ved hjelp av ImmutableSet.kopi av()

Enkelt sagt, den ImmutableSet.kopi av() metoden returnerer en kopi av alle elementene i settet:

Set immutable = ImmutableSet.copyOf (set);

Så etter endring av det opprinnelige settet vil den uforanderlige forekomsten forbli den samme:

[Canada, USA]

5.2. Ved hjelp av ImmutableSet.av()

Tilsvarende med ImmutableSet.of () metoden kan vi umiddelbart lage et uforanderlig sett med de gitte verdiene:

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

Når vi ikke spesifiserer noen elementer, blir ImmutableSet.of () vil returnere et tomt uforanderlig sett.

Dette kan sammenlignes med Java 9-er Sett.av().

6. Konklusjon

I denne raske artikkelen diskuterte vi uforanderlig Settene på Java-språket. Videre viste vi hvordan vi kan skape uforanderlig Settene bruker Collections API fra core Java, Java 9 og Guava library.

Til slutt, som vanlig, er den komplette koden for denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found