Uforanderlig ArrayList i Java

1. Oversigt

Denne hurtige vejledning vises hvordan man laver en ArrayList uforanderlig med kernen JDK, med Guava og endelig med Apache Commons Collections 4.

Denne artikel er en del af "Java - Tilbage til Basic”-Serien her på Baeldung.

2. Med JDK

For det første giver JDK en god måde at få en umodificerbar samling ud af en eksisterende:

Collections.unmodifiableList (liste);

Den nye samling bør ikke længere kunne ændres på dette tidspunkt:

@Test (forventet = ikke understøttetOperationException.class) offentlig ugyldighed givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable () {List list = new ArrayList (Arrays.asList ("one", "two", "three")); List unmodifiableList = Collections.unmodifiableList (liste); unmodifiableList.add ("fire"); }

2.1. Med Java 9

Siden Java 9 kan vi bruge en List.of (E… -elementer) statisk fabriksmetode til at oprette en uforanderlig liste:

@Test (forventet = Ikke understøttetOperationException.class) offentlig endelig ugyldighed givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable () {final List list = new ArrayList (Arrays.asList ("one", "two", "three")); final List unmodifiableList = List.of (list.toArray (ny streng [] {})); unmodifiableList.add ("fire"); }

Læg mærke til, hvordan vi skal konvertere det eksisterende liste ind i en matrix. Dette er fordi List.of (elementer) accepterer vararg-parametre.

3. Med Guava

Guava giver lignende funktionalitet til oprettelse af sin egen version af ImmutableList:

ImmutableList.copyOf (liste);

Tilsvarende - den resulterende liste bør ikke kunne ændres:

@Test (forventet = Ikke understøttetOperationException.class) offentlig ugyldighed givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable () {List list = new ArrayList (Arrays.asList ("one", "two", "three")); Liste unmodifiableList = ImmutableList.copyOf (liste); unmodifiableList.add ("fire"); }

Bemærk, at denne handling faktisk vil oprette en kopi af den oprindelige liste, ikke kun en visning.

Guava leverer også en bygherre - dette vil returnere den stærkt typede ImmutableList i stedet for simpelthen Liste:

@Test (forventet = Ikke understøttetOperationException.class) offentlig ugyldighed givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable () {List list = new ArrayList (Arrays.asList ("one", "two", "three")); ImmutableList unmodifiableList = ImmutableList.builder (). AddAll (liste) .build (); unmodifiableList.add ("fire"); }

4. Med Apache Collections Commons

Endelig leverer Commons Collection også en API til at oprette en umodificerbar liste:

ListUtils.unmodifiableList (liste);

Og igen skal ændring af den resulterende liste resultere i en Ikke-understøttetOperationException:

@Test (forventet = Ikke understøttetOperationException.class) offentlig ugyldighed givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable () {List list = new ArrayList (Arrays.asList ("one", "two", "three")); List unmodifiableList = ListUtils.unmodifiableList (liste); unmodifiableList.add ("fire"); }

5. Konklusion

Denne vejledning illustrerer, hvordan man let kan oprette en umodificerbar liste ud af en eksisterende ArrayList ved hjælp af enten kernen JDK, Google Guava eller Apache Commons Collections.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes på Github - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.