logo

Nepromjenjivi popis u Javi

U Javi, nepromjenjivi popis je popis koji se ne može mijenjati nakon što je kreiran. Pokušaj dodavanja, uklanjanja ili izmjene elemenata na popisu nakon što je stvoren izbacit će iznimku.

Primarna prednost korištenja nepromjenjivih popisa je ta što pružaju sigurnost niti i čine kod robusnijim. Budući da se popis ne može mijenjati nakon što je stvoren, nema rizika da ga više niti pokuša modificirati istovremeno i uzrokuje probleme. Dodatno, nepromjenjivi popisi mogu se lako dijeliti između različitih dijelova programa bez straha od nenamjerne izmjene.

Općenito, korištenje nepromjenjivih popisa u Javi može poboljšati sigurnost i robusnost programa, posebno u okruženjima s više niti gdje zajedničke strukture podataka mogu uzrokovati probleme.

Klasna deklaracija

U Javi, NepromjenjiviList razred je dio Guava knjižnica, koja nudi nekoliko nepromjenjivih klasa zbirke. Koristiti NepromjenjiviList , prvo uvozimo com.google.common.collect paket koji sadrži NepromjenjiviList razreda.

Deklaracija klase od NepromjenjiviList je kako slijedi:

 public abstract class ImmutableList extends ImmutableCollection implements List 

NepromjenjiviList proširuje ImmutableCollection klase i implementira Popis sučelje. To je generička klasa, što znači da možemo kreirati NepromjenjiviList bilo koje vrste podataka. The I u deklaraciji predstavlja parametar tipa, koji možemo zamijeniti bilo kojim imenom klase ili sučelja.

Hijerarhija klasa

The NepromjenjiviList klasa implementira Popis sučelje i predstavlja popis koji se ne može mijenjati nakon što je kreiran.

10 ml do oz

Klasna hijerarhija NepromjenjiviList je kako slijedi:

 java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList 

Ovdje, ImmutableCollection je apstraktna klasa koja pruža skeletnu implementaciju ImmutableCollection sučelje, koje NepromjenjiviList proteže se.

Sve u svemu, NepromjenjiviList klasa pruža prikladan i učinkovit način za stvaranje i korištenje nepromjenjivih popisa u Javi.

Stvaranje ImmutableList

Postoje različiti načini za stvaranje ImmutableList u Javi, ovisno o verziji Jave koju koristite i bibliotekama koje imate na raspolaganju. Evo nekoliko primjera:

1. Korištenje metode Java 9 of():

Java 9 uvela je novu metodu nazvanu of() u sučelju List, koja stvara nepromjenjive popise konciznije i čitljivije. Metoda of() je tvornička metoda koja uzima varijabilni broj argumenata i vraća nepromjenjivi popis koji sadrži te elemente. Može se koristiti s bilo kojom klasom koja implementira sučelje List, uključujući ArrayList, LinkedList i ImmutableList. Jedna od prednosti korištenja metode of() je ta što je mnogo konciznija i pruža sigurnost tijekom kompajliranja izvođenjem zaključka tipa na argumentima, osiguravajući da se samo objekti ispravnog tipa dodaju na popis. Općenito, metoda of() pojednostavljuje stvaranje nepromjenjivih popisa u Javi.

Koraci za pronalaženje rješenja navedeni su u nastavku.

  1. Uvezite klasu List iz paketa Java.util: koji programu omogućuje korištenje sučelja List za stvaranje i rukovanje popisima objekata.
  2. Napravite nepromjenjivi popis koristeći Java 9 tvorničku metodu: kod koristi metodu List.of() za stvaranje nepromjenjivog popisa nizova s ​​četiri elementa.
  3. Pokušaj izmjene popisa: Program pokušava dodati element na nepromjenjivi popis pomoću metode add(), koja nije dopuštena na nepromjenjivim popisima. Kao rezultat toga, program hvata UnsupportedOperationException koju je izbacila metoda add() i ispisuje poruku koja pokazuje da se popis ne može mijenjati.

Naziv datoteke: ImmutableListExample.java

 // Import the required List class from the Java.util package import java.util.List; // Define the class name public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Java 9 factory of() method List fruits = List.of('apple', 'banana', 'orange', 'grape'); // Print the elements of the List System.out.println('Fruits: ' + fruits); // Try to modify the List (will throw UnsupportedOperationException) try { fruits.add('pineapple'); } catch (UnsupportedOperationException ex) { System.out.println('Cannot modify immutable list.'); } } } 

Izlaz:

java anonimna funkcija
 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 

2. Korištenje klase ImmutableList.Builder iz biblioteke Guava:

Dodavanje elemenata na popis u tečnom stilu, što ga čini prikladnim za postupno stvaranje popisa.

Bez obzira na korištenu metodu, rezultirajućem popisu ImmutableList može se pristupiti i ponavljati ga kao bilo kojem drugom popisu, ali se njegov sadržaj ne može mijenjati.

Ovo je postupno rješenje za navedeni kôd:

  1. Uvezite potrebne klase: Uvezite sučelje List i klasu ImmutableList iz paketa com.google.common.collect.
  2. Stvorite nepromjenjivi popis pomoću alata za izgradnju: Stvorite nepromjenjivi popis pomoću alata za izgradnju ImmutableList. Upotrijebite metodu add() za dodavanje elemenata na popis i pozovite metodu build() za stvaranje nepromjenjive liste.
  3. Stvorite nepromjenjivi popis iz postojećeg popisa: Stvorite objekt List sa željenim elementima. Zatim pozovite metodu ImmutableList.copyOf(), prosljeđujući Listu kao parametar, za stvaranje nepromjenjive liste.
  4. Dodavanje više elemenata: Koristite alat za izgradnju ImmutableList za dodavanje više elemenata pomoću metode addAll() i pozovite metodu build() za stvaranje nepromjenjivog popisa.
  5. Ispis popisa: Koristite metodu System.out.println() za ispis sadržaja nepromjenjivih popisa.

Implementacija:

Naziv datoteke: ImmutableListExample.java

 import java.util.List; import com.google.common.collect.ImmutableList; public class ImmutableListExample { public static void main(String[] args) { // Creating an immutable list using the builder ImmutableList immutableList1 = ImmutableListbuilder() .add('Welcome') .add('to') .add('home') .build(); // Creating an immutable list from an existing list List existingList = List.of('Welcome', 'to', 'home', 'Think'); ImmutableList immutableList2 = ImmutableList.copyOf(existingList); // Creating an immutable list from an existing list and adding more elements ImmutableList immutableList3 = ImmutableList.builder() .addAll(existingList) .add('Big') .build(); // Let's print the lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); System.out.println('Immutable List 3: ' + immutableList3); } } 

Izlaz:

 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. Korištenjem metode of() klase ImmutableList

Metoda of() klase ImmutableList u biblioteci Guava omogućuje vam stvaranje nepromjenjivog popisa s fiksnim brojem elemenata. Nakon što je popis kreiran, ne možete dodavati, uklanjati ili mijenjati njegove elemente.

Naziv datoteke: ImmutableListExample.java

probaj catch block java
 import com.google.common.collect.ImmutableList; import java.util.List; class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Guava library's ImmutableList class ImmutableList fruits = ImmutableList.of('apple', 'banana', 'orange', 'grape'); // Print the contents of the immutable List System.out.println('Fruits: ' + fruits); } } 

Izlaz:

 Fruits: [apple, banana, orange, grape] 

4. Korištenjem metode copyOf().

U Javi, metoda copyOf() stvara novi niz koji kopira postojeći niz određene duljine. Metoda uzima dva argumenta: niz koji treba kopirati i duljinu novog niza.

Naziv datoteke: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.*; class ImmutableListExample { public static void main(String[] args) { // Create an ArrayList and add elements to it List myArrayList = new ArrayList(); myArrayList.add('Java'); myArrayList.add('Python'); myArrayList.add('C++'); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList1 = ImmutableList.copyOf(myArrayList); // Create an array and convert it to a list String[] myArray = {'Learning', 'Web', 'Development', 'is', 'Fun'}; List myList = Arrays.asList(myArray); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList2 = ImmutableList.copyOf(myList); // Print the contents of the immutable lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); } } 

Izlaz:

 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 

5. UnsupportedOperationException

Program ilustrira stvaranje nepromjenjivog popisa u Javi pomoću metode Collections.unmodifiableList. Osim toga, pokazuje kako postupati s UnsupportedOperationExceptionom koji se javlja prilikom pokušaja izmjene popisa.

Koraci za pronalaženje rješenja navedeni su u nastavku:

  1. Prvo, stvaramo promjenjivu ArrayList koji sadrži neke početne elemente pomoću od metoda, koja vraća nepromjenjivu listu. Zatim prolazimo ovo ArrayList prema Zbirke.unmodifiableList metoda, koja vraća nepromjenjivi prikaz popisa.
  2. Pokušavamo modificirati nepromjenjivi popis pomoću dodati, ukloniti , i postaviti Budući da je popis nepromjenjiv, pokušaj njegove izmjene izbacit će UnsupportedOperationException .
  3. Mi hvatamo UnsupportedOperationException koji se izbacuje i ispisuje poruku konzoli koja pokazuje koja je operacija pokušana i nije uspjela.

Imajte na umu da je Zbirke.unmodifiableList metoda stvara samo nepromjenjivi pogled na izvorni popis. Nepromjenjivi prikaz odražavat će te promjene ako se izvorni popis izmijeni. Da biste stvorili doista nepromjenjivi popis koji se ne može mijenjati ni na koji način, možete upotrijebiti prilagođenu implementaciju Popis sučelje koje izbacuje iznimku pri pokušaju izmjene popisa.

javascript za padajući izbornik

Implementacija:

Naziv datoteke: ImmutableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using Collections.unmodifiableList List immutableList = Collections.unmodifiableList(new ArrayList(List.of('foo', 'bar', 'baz'))); // Attempt to modify the immutable List using various methods try { immutableList.add('qux'); System.out.println('Successfully added element to immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.remove(0); System.out.println('Successfully removed element from immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.set(0, 'qux'); System.out.println('Successfully modified element in immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } } } 

Izlaz:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Zbirke.unmodifiableList()

Collections.unmodifiableList() je metoda u okviru Java Collections Framework koja stvara neizmjenjivi prikaz postojećeg popisa. Može se zaključiti da će pokušaj izmjene popisa koji se ne može mijenjati dovesti do pojave UnsupportedOperationException. Izvorni popis još uvijek se može mijenjati, a sve promjene će se odraziti na neizmjenjivi popis.

Program prikazuje kako koristiti metodu Collections.unmodifiableList() za generiranje neizmjenjivog prikaza promjenjivog popisa.

Koraci za pronalaženje rješenja navedeni su u nastavku:

  1. Napravite promjenjivi popis promjenjiviList i dodajte mu neke elemente pomoću dodati() metoda ArrayList
  2. Stvorite neizmjenjivi prikaz promjenjivog popisa promjenjiviList koristiti neizmjenjiviList() metodu i dodijelite je varijabli neizmjenjiviList .
  3. Pokušaj modificirati neizmjenjivi popis neizmjenjiviList koristiti dodati() Budući da je neizmjenjivi popis samo za čitanje, ovo će izbaciti UnsupportedOperationException . Poruka se ispisuje na konzoli nakon hvatanja ove iznimke.
  4. Izmijenite izvorni promjenjivi popis promjenjiviList dodavanjem drugog elementa pomoću dodati()
  5. Ispišite i promjenjivi i neizmjenjivi popis na konzolu kako biste pokazali da nepromjenjivi popis odražava promjene napravljene na izvornom promjenjivom popisu.

Naziv datoteke: UnmodifiableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UnmodifiableListExample { public static void main(String[] args) { List mutableList = new ArrayList(); mutableList.add('apple'); mutableList.add('banana'); mutableList.add('orange'); // Create an unmodifiable view of the mutableList List unmodifiableList = Collections.unmodifiableList(mutableList); // Attempt to modify the unmodifiableList will throw UnsupportedOperationException try { unmodifiableList.add('pear'); } catch (UnsupportedOperationException e) { System.out.println('Attempt to modify unmodifiableList failed: ' + e.getMessage()); } // The original mutableList can still be modified mutableList.add('pear'); // The unmodifiableList will reflect the changes made to the original mutableList System.out.println('mutableList: ' + mutableList); // [apple, banana, orange, pear] System.out.println('unmodifiableList: ' + unmodifiableList); // [apple, banana, orange, pear] } } 

Izlaz:

 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] 

Prednosti ImmutableList

ImmutableList ima nekoliko prednosti, uključujući:

    Sigurnost niti:Budući da je ImmutableList nepromjenjiv, on je inherentno siguran za niti. Više niti može pristupiti istom popisu bez ikakvog rizika od interferencije niti ili nedosljednosti memorije.Sigurnost:Nepromjenjivi popisi manje su skloni sigurnosnim propustima. Na primjer, ako napadač pokuša modificirati popis dodavanjem ili uklanjanjem elemenata, on to ne može učiniti jer je popis nepromjenjiv.Izvođenje:Budući da su nepromjenjivi popisi samo za čitanje, mogu se predmemorirati za bolju izvedbu. Ako se popisu treba pristupiti više puta, upotreba nepromjenjivog popisa umjesto stvaranja novog popisa svaki put može pomoći u izbjegavanju dodatnih troškova.Predvidljivost:Budući da se nepromjenjivi popisi ne mogu mijenjati, njihovo je ponašanje predvidljivo. Neke prednosti korištenja nepromjenjivih popisa eliminiraju potrebu za obrambenim programiranjem i olakšavaju razmišljanje o kodu.Pojednostavljuje kodiranje:Nepromjenjivi popisi pojednostavljuju kodiranje eliminirajući potrebu za sinkronizacijom, obrambenim kopiranjem i ručnim upravljanjem memorijom sklonom pogreškama. Rezultat ovog pristupa je kod koji je lakši za održavanje i ima čistiji izgled.Olakšava testiranje:Nepromjenjive liste lakše je testirati jer se njihov sadržaj ne mijenja. Ovaj pristup olakšava pisanje testova koji pokrivaju sve moguće scenarije i rubne slučajeve.