Nepromjenjivi set u Javi

1. Uvod

U ovom vodiču, pogledati ćemo različite načine konstruiranja nepromjenjivog skupa u Javi.

Ali prvo, shvatimo nepromjenjivi skup i uvidimo zašto nam je potreban.

2. Što je nepromjenjivi skup?

Općenito, nepromjenjivi objekt neće promijeniti svoje unutarnje stanje nakon što ga stvorimo. To ga prema zadanim postavkama čini sigurnim za nit. Ista logika vrijedi i za nepromjenjive skupove.

Pretpostavimo da imamo a HashSet primjer s nekim vrijednostima. Ako ga učinimo nepromjenjivim, stvorit ćemo verziju našeg skupa "samo za čitanje". Tako, svaki pokušaj modifikacije njegovog stanja izbacit će UnsupportedOperationException.

Pa, zašto nam to treba?

Svakako, najčešći slučaj nepromjenjivog skupa je okruženje s više niti. Dakle, možemo dijeliti nepromjenjive podatke kroz niti bez brige o sinkronizaciji.

U međuvremenu, važno je imati na umu: nepromjenjivost se odnosi samo na skup, a ne i na njegove elemente. Nadalje, bez problema možemo izmijeniti reference instance postavljenih elemenata.

3. Stvorite nepromjenjive skupove u jezgri Java

Uz samo osnovne Java klase na raspolaganju, možemo koristiti Zbirke.unmodifiableSet () metoda za umotavanje originala Postavi.

Prvo, stvorimo jednostavan HashSet instancu i inicijalizirajte je s Niz vrijednosti:

Set set = new HashSet (); set.add ("Kanada"); set.add ("SAD");

Dalje, završimo s tim Zbirke.unmodifiableSet ():

Postavi unmodifiableSet = Collections.unmodifiableSet (set);

Konačno, kako bismo bili sigurni da je naš nemodifibilanSet instanca je nepromjenjiva, stvorimo jednostavan testni slučaj:

@Test (očekuje se = UnsupportedOperationException.class) public void testUnmodifiableSet () {// kreira i inicijalizira skup instanci Set unmodifiableSet = Collections.unmodifiableSet (set); unmodifiableSet.add ("Kostarika"); }

Kao što i očekujemo, test će se uspješno pokrenuti. Nadalje, dodati() rad je zabranjen nemodificiraniSet instance i bacit će UnsupportedOperationException.

Promijenimo početno slovo postavljen instanci dodavanjem iste vrijednosti:

set.add ("Kostarika");

Na taj način neizravno modificiramo nepromjenjivi skup. Dakle, kada ispisujemo nemodifibilanSet primjer:

[Kanada, SAD, Kostarika]

Kao što vidimo, "Kostarika" Predmet je također prisutan u nemodifibilanSet.

4. Stvorite nepromjenjive skupove u Javi 9

Od Jave 9, Set.of (elementi) Dostupna je statička tvornička metoda za stvaranje nepromjenjivih skupova:

Nepromjenjiv set = Set.of ("Kanada", "SAD");

5. Stvorite nepromjenjive skupove u Guavi

Drugi način na koji možemo konstruirati nepromjenjivi skup jest korištenje Guavinog ImmutableSet razred. Kopira postojeće podatke u novu nepromjenjivu instancu. Kao rezultat, podaci iznutra ImmutableSet neće se promijeniti kad promijenimo izvornik Postavi.

Kao i osnovna Java implementacija, svaki pokušaj modificiranja stvorene nepromjenjive instance izbacit će UnsupportedOperationException.

Sada, istražimo različite načine stvaranja nepromjenjivih primjeraka.

5.1. Koristeći ImmutableSet.kopija od()

Jednostavno rečeno, ImmutableSet.kopija od() metoda vraća kopiju svih elemenata u skupu:

Postavi nepromjenjivo = ImmutableSet.copyOf (set);

Dakle, nakon promjene početnog skupa, nepromjenjiva instanca ostat će ista:

[Kanada, SAD]

5.2. Koristeći ImmutableSet.od()

Slično tome, s ImmutableSet.of () metodom možemo trenutno stvoriti nepromjenjivi skup s danim vrijednostima:

Postavi nepromjenjiv = ImmutableSet.of ("Kanada", "SAD");

Kada ne odredimo nijedan element, ImmutableSet.of () vratit će prazan nepromjenjivi skup.

To se može usporediti s Javom 9 Postavi.od().

6. Zaključak

U ovom kratkom članku razgovarali smo o nepromjenjivim Kompleti na jeziku Java. Štoviše, pokazali smo kako stvoriti nepromjenjive Kompleti pomoću API-ja Collections iz jezgre Java, Java 9 i knjižnice Guava.

Napokon, kao i obično, cjeloviti kôd za ovaj članak dostupan je na GitHubu.