Onveranderlijke ArrayList in Java

1. Overzicht

Deze korte tutorial zal laten zien hoe maak je een ArrayList onveranderlijk met de kern JDK, met Guava en tenslotte met Apache Commons Collections 4.

Dit artikel maakt deel uit van de “Java - Terug naar Basic”Serie hier op Baeldung.

2. Met de JDK

Ten eerste biedt de JDK een leuke manier om een ​​niet-wijzigbare verzameling uit een bestaande verzameling te halen:

Collections.unmodifiableList (lijst);

De nieuwe collectie zou op dit punt niet meer gewijzigd moeten kunnen worden:

@Test (verwacht = UnsupportedOperationException.class) openbare ongeldige gegevenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable () {Lijstlijst = nieuwe ArrayList (Arrays.asList ("één", "twee", "drie")); List unmodifiableList = Collections.unmodifiableList (lijst); unmodifiableList.add ("vier"); }

2.1. Met Java 9

Sinds Java 9 kunnen we een Lijst van (E ... elementen) statische fabrieksmethode om een ​​onveranderlijke lijst te maken:

@Test (verwacht = UnsupportedOperationException.class) openbare laatste leegte gegevenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable () {laatste lijstlijst = nieuwe ArrayList (Arrays.asList ("een", "twee", "drie")); final List unmodifiableList = List.of (list.toArray (new String [] {})); unmodifiableList.add ("vier"); }

Merk op hoe we het bestaande moeten converteren lijst in een array. Dit is zo omdat List.of (elementen) accepteert vararg-parameters.

3. Met Guava

Guava biedt vergelijkbare functionaliteit voor het maken van zijn eigen versie van Onveranderlijke lijst:

ImmutableList.copyOf (lijst);

Evenzo - de resulterende lijst mag niet kunnen worden gewijzigd:

@Test (verwacht = UnsupportedOperationException.class) openbare ongeldige gegevenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable () {Lijstlijst = nieuwe ArrayList (Arrays.asList ("één", "twee", "drie")); Lijst unmodifiableList = ImmutableList.copyOf (lijst); unmodifiableList.add ("vier"); }

Merk op dat deze operatie daadwerkelijk zal gebeuren maak een kopie van de originele lijst, niet alleen een uitzicht.

Guava biedt ook een bouwer - dit zal de sterk getypeerde teruggeven Onveranderlijke lijst in plaats van simpelweg Lijst:

@Test (verwacht = UnsupportedOperationException.class) openbare ongeldige gegevenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable () {Lijstlijst = nieuwe ArrayList (Arrays.asList ("een", "twee", "drie")); ImmutableList unmodifiableList = ImmutableList.builder (). AddAll (lijst) .build (); unmodifiableList.add ("vier"); }

4. Met de Apache Collections Commons

Ten slotte biedt Commons Collection ook een API om een ​​niet-wijzigbare lijst te maken:

ListUtils.unmodifiableList (lijst);

En nogmaals, het wijzigen van de resulterende lijst zou moeten resulteren in een UnsupportedOperationException:

@Test (verwacht = UnsupportedOperationException.class) public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable () {List list = nieuwe ArrayList (Arrays.asList ("een", "twee", "drie")); Lijst unmodifiableList = ListUtils.unmodifiableList (lijst); unmodifiableList.add ("vier"); }

5. Conclusie

Deze tutorial laat zien hoe je gemakkelijk maak een niet-wijzigbare lijst uit een bestaande ArrayList met behulp van de core JDK, Google Guava of Apache Commons Collections.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op Github - dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.