logo

Immutable List v Jave

V Jave je nemenný zoznam zoznam, ktorý po vytvorení nemožno upravovať. Pokus o pridanie, odstránenie alebo úpravu prvkov v zozname po jeho vytvorení vyvolá výnimku.

Hlavnou výhodou používania nemenných zoznamov je, že poskytujú bezpečnosť vlákien a robia kód robustnejším. Keďže zoznam nie je možné po jeho vytvorení upraviť, neexistuje riziko, že by sa ho viaceré vlákna pokúsili upraviť súčasne a spôsobili by problémy. Okrem toho je možné nemenné zoznamy jednoducho zdieľať medzi rôznymi časťami programu bez obáv z neúmyselnej úpravy.

Celkovo môže používanie nemenných zoznamov v jazyku Java zlepšiť bezpečnosť a robustnosť programu, najmä vo viacvláknových prostrediach, kde zdieľané dátové štruktúry môžu spôsobovať problémy.

Vyhlásenie o triede

V Jave, ImmutableList trieda je súčasťou Guava knižnica, ktorá poskytuje niekoľko nemenných tried kolekcií. Použit ImmutableList , najprv importujeme com.google.common.collect balík obsahujúci ImmutableList trieda.

dátové štruktúry v jazyku Java

Vyhlásenie o triede ImmutableList je nasledujúca:

 public abstract class ImmutableList extends ImmutableCollection implements List 

ImmutableList predlžuje ImmutableCollection triedy a realizuje Zoznam rozhranie. Je to generická trieda, čo znamená, že môžeme vytvoriť ImmutableList akéhokoľvek dátového typu. The A v deklarácii predstavuje parameter typu, ktorý môžeme nahradiť ľubovoľným názvom triedy alebo rozhrania.

Triedna hierarchia

The ImmutableList trieda implementuje Zoznam a predstavuje zoznam, ktorý po vytvorení nie je možné upravovať.

Triedna hierarchia ImmutableList je nasledujúca:

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

Tu, ImmutableCollection je abstraktná trieda, ktorá poskytuje skeletovú implementáciu triedy ImmutableCollection rozhranie, ktoré ImmutableList predlžuje.

Celkovo možno povedať, ImmutableList poskytuje pohodlný a efektívny spôsob vytvárania a používania nemenných zoznamov v jazyku Java.

Vytvorenie ImmutableList

Existujú rôzne spôsoby, ako vytvoriť ImmutableList v Jave, v závislosti od verzie Javy, ktorú používate, a knižníc, ktoré máte k dispozícii. Tu je niekoľko príkladov:

1. Použitie metódy Java 9 of():

Java 9 predstavila novú metódu s názvom of() v rozhraní List, ktorá vytvára nemenné zoznamy stručnejšie a čitateľnejšie. Metóda of() je továrenská metóda, ktorá berie premenlivý počet argumentov a vracia nemenný zoznam obsahujúci tieto prvky. Dá sa použiť s akoukoľvek triedou, ktorá implementuje rozhranie List, vrátane ArrayList, LinkedList a ImmutableList. Jednou z výhod použitia metódy of() je, že je oveľa stručnejšia a poskytuje bezpečnosť v čase kompilácie vykonaním typovej inferencie na argumentoch, čím sa zabezpečí, že do zoznamu sa pridajú len objekty správneho typu. Celkovo metóda of() zjednodušuje vytváranie nemenných zoznamov v Jave.

Kroky na nájdenie riešenia sú uvedené nižšie.

  1. Importujte triedu List z balíka Java.util: Čo umožňuje programu používať rozhranie Zoznam na vytváranie a manipuláciu so zoznamami objektov.
  2. Vytvorte nemenný zoznam pomocou továrenskej metódy Java 9: ​​Kód používa metódu List.of() na vytvorenie nemenného zoznamu reťazcov so štyrmi prvkami.
  3. Pokus o úpravu zoznamu: Program sa pokúša pridať prvok do nemenného zoznamu pomocou metódy add(), čo nie je povolené na nemenných zoznamoch. Výsledkom je, že program zachytí výnimku UnsupportedOperationException vyvolanú metódou add() a vypíše správu oznamujúcu, že zoznam nemožno upraviť.

Názov súboru: 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.'); } } } 

Výkon:

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

2. Použitie triedy ImmutableList.Builder z knižnice Guava:

Pridávanie prvkov do zoznamu plynulým štýlom, čo uľahčuje postupné vytváranie zoznamu.

Bez ohľadu na použitú metódu je možné pristupovať k výslednému ImmutableList a opakovať ho ako ktorýkoľvek iný zoznam, ale jeho obsah nemožno upravovať.

Tu je postupné riešenie pre daný kód:

  1. Importujte požadované triedy: Importujte rozhranie List a triedu ImmutableList z balíka com.google.common.collect.
  2. Vytvorte nemenný zoznam pomocou zostavovača: Vytvorte nemenný zoznam pomocou zostavovača ImmutableList. Pomocou metódy add() pridajte prvky do zoznamu a zavolaním metódy build() vytvorte nemenný zoznam.
  3. Vytvorenie nemenného zoznamu z existujúceho zoznamu: Vytvorte objekt zoznamu s požadovanými prvkami. Potom zavolajte metódu ImmutableList.copyOf() a odovzdajte List ako parameter, aby ste vytvorili nemenný zoznam.
  4. Pridanie ďalších prvkov: Použite zostavovač ImmutableList na pridanie ďalších prvkov pomocou metódy addAll() a zavolaním metódy build() vytvorte nemenný zoznam.
  5. Tlač zoznamov: Na vytlačenie obsahu nemenných zoznamov použite metódu System.out.println().

Implementácia:

Názov súboru: 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); } } 

Výkon:

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

3. Použitím metódy of() triedy ImmutableList

Metóda of() triedy ImmutableList v knižnici Guava umožňuje vytvoriť nemenný zoznam s pevným počtom prvkov. Po vytvorení zoznamu nemôžete pridávať, odstraňovať ani upravovať jeho prvky.

Názov súboru: ImmutableListExample.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); } } 

Výkon:

 Fruits: [apple, banana, orange, grape] 

4. Použitím metódy copyOf().

V jazyku Java metóda copyOf() vytvorí nové pole, ktoré skopíruje existujúce pole so špecifikovanou dĺžkou. Metóda má dva argumenty: pole, ktoré sa má skopírovať, a dĺžku nového poľa.

Názov súboru: 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); } } 

Výkon:

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

5. UnsupportedOperationException

Program ilustruje vytváranie nemenného zoznamu v jazyku Java pomocou metódy Collections.unmodifiableList. Okrem toho ukazuje, ako spracovať výnimku UnsupportedOperationException, ktorá je vyvolaná pri pokuse o úpravu zoznamu.

Kroky na nájdenie riešenia sú uvedené nižšie:

  1. Najprv vytvoríme premenlivé ArrayList obsahujúce niektoré počiatočné prvky pomocou z metóda, ktorá vracia nemenný zoznam. Toto potom prejdeme ArrayList k Collections.unmodifiableList metóda, ktorá vracia nemenné zobrazenie zoznamu.
  2. Pokúšame sa upraviť nemenný zoznam pomocou pridať, odstrániť , a nastaviť Keďže zoznam je nemenný, pokus o jeho úpravu vyvolá UnsupportedOperationException .
  3. Chytáme UnsupportedOperationException ktorý sa vyvolá a vytlačí správu do konzoly s uvedením, o ktorú operáciu ste sa pokúsili a ktorá bola neúspešná.

Všimnite si, že Collections.unmodifiableList metóda vytvára iba nemenné zobrazenie pôvodného zoznamu. Nemenné zobrazenie bude odrážať tieto zmeny, ak sa pôvodný zoznam upraví. Ak chcete vytvoriť skutočne nemenný zoznam, ktorý nemožno žiadnym spôsobom upraviť, môžete použiť vlastnú implementáciu Zoznam rozhranie, ktoré pri pokuse o úpravu zoznamu vyvolá výnimku.

Implementácia:

Názov súboru: 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()); } } } 

Výkon:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() je metóda v rámci Java Collections Framework, ktorá vytvára nemeniteľný pohľad na existujúci zoznam. Dá sa usúdiť, že pokus o úpravu neupraviteľného zoznamu povedie k výskytu výnimky UnsupportedOperationException. Pôvodný zoznam je možné stále upravovať a akékoľvek zmeny sa prejavia v neupraviteľnom zozname.

Program ukazuje, ako využiť metódu Collections.unmodifiableList() na generovanie nemodifikovateľnej reprezentácie meniteľného zoznamu.

Kroky na nájdenie riešenia sú uvedené nižšie:

  1. Vytvorte meniteľný zoznam mutableList a pridajte do nej niektoré prvky pomocou pridať () metóda ArrayList
  2. Vytvorte nemeniteľné zobrazenie meniteľného zoznamu mutableList pomocou unmodifiableList() metódu a priraďte ju k premennej nezmeniteľný zoznam .
  3. Pokúste sa upraviť nemeniteľný zoznam nezmeniteľný zoznam pomocou pridať () Keďže nemodifikovateľný zoznam je len na čítanie, vyvolá to UnsupportedOperationException . Po zachytení tejto výnimky sa na konzole vytlačí správa.
  4. Upravte pôvodný meniteľný zoznam mutableList pridaním ďalšieho prvku pomocou pridať ()
  5. Vytlačte meniteľné aj nemodifikovateľné zoznamy do konzoly, aby ste ukázali, že nemodifikovateľný zoznam odráža zmeny vykonané v pôvodnom meniteľnom zozname.

Názov súboru: 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] } } 

Výkon:

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

Výhody ImmutableList

ImmutableList má niekoľko výhod, vrátane:

    Bezpečnosť závitu:Keďže ImmutableList je nemenný, je vo svojej podstate bezpečný pre vlákna. Viacero vlákien môže pristupovať k rovnakému zoznamu bez akéhokoľvek rizika rušenia vlákien alebo nekonzistencie pamäte.Zabezpečenie:Nemenné zoznamy sú menej náchylné na bezpečnostné chyby. Ak sa napríklad útočník pokúsi upraviť zoznam pridaním alebo odstránením prvkov, nemôže tak urobiť, pretože zoznam je nemenný.Výkon:Keďže nemenné zoznamy sú len na čítanie, možno ich uložiť do vyrovnávacej pamäte pre lepší výkon. Ak je potrebné pristupovať k zoznamu viackrát, použitie nemenného zoznamu namiesto zakaždým vytvárania nového zoznamu môže pomôcť vyhnúť sa réžii.Predvídateľnosť:Keďže nemenné zoznamy nie je možné upravovať, ich správanie je predvídateľné. Niektoré výhody používania nemenných zoznamov eliminujú potrebu defenzívneho programovania a uľahčujú zdôvodnenie kódu.Zjednodušuje kódovanie:Nemenné zoznamy zjednodušujú kódovanie elimináciou potreby synchronizácie, obranného kopírovania a manuálnej správy pamäte náchylnej na chyby. Výsledkom tohto prístupu je kód, ktorý sa ľahšie udržiava a má čistejší vzhľad.Uľahčuje testovanie:Nemenné zoznamy sa testujú jednoduchšie, pretože ich obsah sa nemení. Tento prístup uľahčuje písanie testov, ktoré pokrývajú všetky možné scenáre a okrajové prípady.