V Javě je neměnný seznam seznam, který po vytvoření nelze upravit. Pokus o přidání, odebrání nebo úpravu prvků v seznamu po jeho vytvoření vyvolá výjimku.
Primární výhodou použití neměnných seznamů je, že poskytují bezpečnost vláken a činí kód robustnějším. Vzhledem k tomu, že seznam nelze po vytvoření upravit, neexistuje riziko, že by se jej několik vláken pokusilo upravit současně a způsobilo by problémy. Kromě toho lze neměnné seznamy snadno sdílet mezi různými částmi programu bez obav z neúmyslné změny.
Celkově může použití neměnných seznamů v Javě zlepšit bezpečnost a robustnost programu, zejména ve vícevláknových prostředích, kde mohou sdílené datové struktury způsobovat problémy.
Třídní prohlášení
V Javě, ImmutableList třída je součástí Kvajáva knihovna, která poskytuje několik neměnných tříd sbírek. Použít ImmutableList , nejprve importujeme com.google.common.collect balíček obsahující ImmutableList třída.
Deklarace třídy ImmutableList je následující:
public abstract class ImmutableList extends ImmutableCollection implements List
ImmutableList prodlužuje ImmutableCollection třídy a implementuje Seznam rozhraní. Je to generická třída, což znamená, že můžeme vytvořit ImmutableList jakéhokoli datového typu. The A v deklaraci představuje parametr typu, který můžeme nahradit libovolným názvem třídy nebo rozhraní.
Hierarchie tříd
The ImmutableList třída implementuje Seznam rozhraní a představuje seznam, který po vytvoření nelze upravit.
Třídní hierarchie ImmutableList je následující:
java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList
Tady, ImmutableCollection je abstraktní třída, která poskytuje základní implementaci třídy ImmutableCollection rozhraní, které ImmutableList rozšiřuje.
Celkově vzato, ImmutableList poskytuje pohodlný a efektivní způsob, jak vytvářet a používat neměnné seznamy v Javě.
Vytvoření ImmutableList
Existují různé způsoby, jak vytvořit ImmutableList v Javě, v závislosti na verzi Javy, kterou používáte, a na knihovnách, které máte k dispozici. Zde jsou nějaké příklady:
1. Použití metody Java 9 of():
Java 9 představila v rozhraní List novou metodu nazvanou of(), která vytváří neměnné seznamy stručněji a čitelněji. Metoda of() je tovární metoda, která přebírá proměnný počet argumentů a vrací neměnný seznam obsahující tyto prvky. Lze jej použít s jakoukoli třídou, která implementuje rozhraní List, včetně ArrayList, LinkedList a ImmutableList. Jednou z výhod použití metody of() je, že je mnohem stručnější a poskytuje bezpečnost v době kompilace prováděním typové inference na argumentech, což zajišťuje, že do seznamu budou přidány pouze objekty správného typu. Celkově metoda of() zjednodušuje vytváření neměnných seznamů v Javě.
parciální derivační latex
Kroky k nalezení řešení jsou uvedeny níže.
- Importujte třídu List z balíčku Java.util: Což umožňuje programu používat rozhraní Seznam k vytváření a manipulaci se seznamy objektů.
- Vytvořte neměnný seznam pomocí tovární metody Java 9: Kód používá metodu List.of() k vytvoření neměnného seznamu řetězců se čtyřmi prvky.
- Pokus o úpravu seznamu: Program se pokusí přidat prvek do neměnného seznamu pomocí metody add(), což není povoleno na neměnných seznamech. Výsledkem je, že program zachytí výjimku UnsupportedOperationException vyvolanou metodou add() a vypíše zprávu, že seznam nelze upravit.
Název souboru: 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ýstup:
Fruits: [apple, banana, orange, grape] Cannot modify immutable List.
2. Použití třídy ImmutableList.Builder z knihovny Guava:
Přidávání prvků do seznamu plynulým stylem, takže je vhodné pro postupné vytváření seznamu.
Bez ohledu na použitou metodu lze k výslednému seznamu ImmutableList přistupovat a iterovat jej jako jakýkoli jiný seznam, ale jeho obsah nelze upravovat.
Zde je postupné řešení pro daný kód:
- Import požadovaných tříd: Importujte rozhraní List a třídu ImmutableList z balíčku com.google.common.collect.
- Vytvoření neměnného seznamu pomocí stavitele: Vytvořte neměnný seznam pomocí stavitele ImmutableList. Pomocí metody add() přidejte prvky do seznamu a voláním metody build() vytvořte neměnný seznam.
- Vytvoření neměnného seznamu z existujícího seznamu: Vytvořte objekt List s požadovanými prvky. Potom zavolejte metodu ImmutableList.copyOf() a předejte List jako parametr, abyste vytvořili neměnný seznam.
- Přidání dalších prvků: Pomocí sestavovače ImmutableList přidejte další prvky pomocí metody addAll() a voláním metody build() vytvořte neměnný seznam.
- Tisk seznamů: Pomocí metody System.out.println() vytiskněte obsah neměnných seznamů.
Implementace:
Název souboru: 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ýstup:
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 metody of() třídy ImmutableList
Metoda of() třídy ImmutableList v knihovně Guava umožňuje vytvořit neměnný seznam s pevným počtem prvků. Jakmile je seznam vytvořen, nemůžete přidávat, odebírat ani upravovat jeho prvky.
Název souboru: 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ýstup:
název kosmetických produktů
Fruits: [apple, banana, orange, grape]
4. Pomocí metody copyOf().
V Javě metoda copyOf() vytvoří nové pole, které zkopíruje existující pole se zadanou délkou. Metoda má dva argumenty: pole, které se má zkopírovat, a délku nového pole.
Název souboru: 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ýstup:
Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun]
5. UnsupportedOperationException
Program ukazuje vytvoření neměnného seznamu v Javě pomocí metody Collections.unmodifiableList. Navíc ukazuje, jak zacházet s výjimkou UnsupportedOperationException, která je vyvolána při pokusu o úpravu seznamu.
Kroky k nalezení řešení jsou uvedeny níže:
- Nejprve vytvoříme mutable ArrayList obsahující některé počáteční prvky pomocí z metoda, která vrací neměnný seznam. Toto pak předáme ArrayList k Collections.unmodifiableList metoda, která vrací neměnný pohled na seznam.
- Snažíme se upravit neměnný seznam pomocí přidat, odebrat , a soubor Protože je seznam neměnný, pokus o jeho úpravu vyvolá UnsupportedOperationException .
- Chytáme se UnsupportedOperationException který je vyvolán a vytiskne zprávu do konzoly s uvedením, o kterou operaci jste se pokusili a která byla neúspěšná.
Všimněte si, že Collections.unmodifiableList metoda pouze vytvoří neměnný pohled na původní seznam. Neměnný pohled bude tyto změny odrážet, pokud se změní původní seznam. Chcete-li vytvořit skutečně neměnný seznam, který nelze žádným způsobem upravit, můžete použít vlastní implementaci Seznam rozhraní, které při pokusu o úpravu seznamu vyvolá výjimku.
Implementace:
Název souboru: 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ýstup:
UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null
6. Collections.unmodifiableList()
Collections.unmodifiableList() je metoda v Java Collections Framework, která vytváří neměnný pohled na existující seznam. Lze odvodit, že pokus o úpravu nemodifikovatelného seznamu povede k výskytu výjimky UnsupportedOperationException. Původní seznam lze stále upravovat a jakékoli změny se projeví v neupravitelném seznamu.
Program ukazuje, jak využít metodu Collections.unmodifiableList() ke generování nemodifikovatelné reprezentace proměnlivého seznamu.
Kroky k nalezení řešení jsou uvedeny níže:
- Vytvořte proměnlivý seznam mutableList a přidat do něj některé prvky pomocí přidat() metoda ArrayList
- Vytvořte nemodifikovatelné zobrazení proměnlivého seznamu mutableList za použití nemodifikovaný seznam() metodu a přiřadit ji k proměnné nemodifikovatelný seznam .
- Pokuste se upravit seznam, který nelze upravit nemodifikovatelný seznam za použití přidat() Vzhledem k tomu, že nemodifikovatelný seznam je pouze pro čtení, vyvolá to UnsupportedOperationException . Po zachycení této výjimky se na konzoli vytiskne zpráva.
- Upravte původní proměnlivý seznam mutableList přidáním dalšího prvku pomocí přidat()
- Vytiskněte do konzole seznamy proměnných i nemodifikovaných, abyste ukázali, že seznam, který nelze upravit, odráží změny provedené v původním seznamu proměnných.
Název souboru: 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ýstup:
Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear]
Výhody ImmutableList
ImmutableList má několik výhod, včetně: