logo

Neměnný seznam v Javě

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.

  1. 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ů.
  2. 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.
  3. 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:

  1. Import požadovaných tříd: Importujte rozhraní List a třídu ImmutableList z balíčku com.google.common.collect.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

  1. 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.
  2. 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 .
  3. 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:

  1. Vytvořte proměnlivý seznam mutableList a přidat do něj některé prvky pomocí přidat() metoda ArrayList
  2. 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 .
  3. 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.
  4. Upravte původní proměnlivý seznam mutableList přidáním dalšího prvku pomocí přidat()
  5. 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ě:

    Bezpečnost závitu:Protože je ImmutableList neměnný, je ze své podstaty bezpečný pro vlákna. Více vláken může přistupovat ke stejnému seznamu bez jakéhokoli rizika interference vláken nebo nekonzistence paměti.Bezpečnostní:Neměnné seznamy jsou méně náchylné k bezpečnostním chybám. Pokud se například útočník pokusí upravit seznam přidáním nebo odebráním prvků, nemůže tak učinit, protože seznam je neměnný.Výkon:Protože neměnné seznamy jsou pouze pro čtení, lze je pro lepší výkon uložit do mezipaměti. Pokud je třeba k seznamu přistupovat vícekrát, můžete se vyhnout režii pomocí neměnného seznamu namísto vytváření nového seznamu pokaždé.Předvídatelnost:Protože neměnné seznamy nelze upravovat, je jejich chování předvídatelné. Některé výhody používání neměnných seznamů eliminují potřebu defenzivního programování a usnadňují uvažování o kódu.Zjednodušuje kódování:Neměnné seznamy zjednodušují kódování tím, že eliminují potřebu synchronizace, obranného kopírování a manuální správy paměti náchylné k chybám. Výsledkem tohoto přístupu je kód, který se snadněji udržuje a má čistší vzhled.Usnadňuje testování:Neměnné seznamy se snáze testují, protože jejich obsah se nemění. Tento přístup usnadňuje psaní testů, které pokrývají všechny možné scénáře a okrajové případy.