logo

Javaの不変リスト

Java では、不変リストは、作成後に変更できないリストです。リストの作成後にリスト内の要素を追加、削除、または変更しようとすると、例外がスローされます。

不変リストを使用する主な利点は、不変リストによりスレッドの安全性が提供され、コードがより堅牢になることです。リストは作成後に変更できないため、複数のスレッドが同時にリストを変更しようとして問題が発生するリスクはありません。さらに、不変リストは、意図しない変更を心配することなく、異なるプログラム部分間で簡単に共有できます。

全体として、Java で不変リストを使用すると、特に共有データ構造によって問題が発生する可能性があるマルチスレッド環境で、プログラムの安全性と堅牢性が向上します。

クラス宣言

Javaでは、 不変リスト クラスはの一部です グアバ ライブラリ。いくつかの不変コレクション クラスを提供します。使用するには 不変リスト 、最初にインポートします com.google.common.collect を含むパッケージ 不変リスト クラス。

のクラス宣言 不変リスト 以下のとおりであります:

文字列値
 public abstract class ImmutableList extends ImmutableCollection implements List 

不変リスト を延長します 不変コレクション クラスを実装し、 リスト インターフェース。これはジェネリック クラスです。つまり、 不変リスト 任意のデータ型。の そして 宣言内の は型パラメータを表し、任意のクラス名またはインターフェイス名に置き換えることができます。

クラス階層

不変リスト クラスは リスト インターフェースであり、一度作成すると変更できないリストを表します。

のクラス階層 不変リスト 以下のとおりであります:

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

ここ、 不変コレクション の骨格的な実装を提供する抽象クラスです。 不変コレクション インターフェース、 不変リスト 伸びる。

全体として、 不変リスト クラスは、Java で不変リストを作成および使用するための便利で効率的な方法を提供します。

ImmutableListの作成

Java で ImmutableList を作成するには、使用している Java のバージョンと利用可能なライブラリに応じて、さまざまな方法があります。ここではいくつかの例を示します。

1. Java 9 of() メソッドを使用します。

Java 9 では、List インターフェースに of() と呼ばれる新しいメソッドが導入されました。これは、不変のリストをより簡潔かつ読みやすく作成します。 of() メソッドは、可変数の引数を受け取り、それらの要素を含む不変のリストを返すファクトリ メソッドです。 ArrayList、LinkedList、ImmutableList など、List インターフェイスを実装する任意のクラスで使用できます。 of() メソッドを使用する利点の 1 つは、メソッドがより簡潔であり、引数に対して型推論を実行することでコンパイル時の安全性が提供され、正しい型のオブジェクトのみが List に追加されることです。全体として、of() メソッドは Java での不変リストの作成を簡素化します。

解決策を見つける手順を以下に示します。

  1. Java.util パッケージから List クラスをインポートします。これにより、プログラムは List インターフェイスを使用してオブジェクトのリストを作成および操作できるようになります。
  2. Java 9 ファクトリ メソッドを使用して不変リストを作成する: コードでは List.of() メソッドを使用して、4 つの要素を含む文字列の不変リストを作成します。
  3. リストの変更を試みる: プログラムは、add() メソッドを使用して不変リストに要素を追加しようとしますが、これは不変リストでは許可されていません。その結果、プログラムは add() メソッドによってスローされた UnsupportedOperationException を捕捉し、リストを変更できないことを示すメッセージを出力します。

ファイル名: 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.'); } } } 

出力:

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

2. Guava ライブラリの ImmutableList.Builder クラスを使用します。

流暢なスタイルで要素をリストに追加し、リストを段階的に作成するのに便利です。

使用されるメソッドに関係なく、結果として得られる ImmutableList は他のリストと同様にアクセスして反復処理できますが、その内容は変更できません。

指定されたコードに対する段階的な解決策は次のとおりです。

  1. 必要なクラスをインポートする: List インターフェースと ImmutableList クラスを com.google.common.collect パッケージからインポートします。
  2. ビルダーを使用して不変リストを作成する: ImmutableList ビルダーを使用して不変リストを作成します。 add() メソッドを使用して List に要素を追加し、build() メソッドを呼び出して不変のリストを作成します。
  3. 既存のリストから不変リストを作成する: 必要な要素を含む List オブジェクトを作成します。次に、ImmutableList.copyOf() メソッドを呼び出し、List をパラメータとして渡し、不変リストを作成します。
  4. 要素の追加: ImmutableList ビルダーを使用して addAll() メソッドを使用して要素を追加し、build() メソッドを呼び出して不変リストを作成します。
  5. リストを印刷する: System.out.println() メソッドを使用して、不変リストの内容を印刷します。

実装:

ファイル名: 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); } } 

出力:

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

3. ImmutableListクラスのof()メソッドを利用する

Guava ライブラリの ImmutableList クラスの of() メソッドを使用すると、固定数の要素を持つ不変のリストを作成できます。リストが作成されると、その要素を追加、削除、または変更することはできません。

ファイル名: 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); } } 

出力:

 Fruits: [apple, banana, orange, grape] 

4. copyOf() メソッドを使用する

Java では、copyOf() メソッドは、指定された長さの既存の配列をコピーする新しい配列を作成します。このメソッドは、コピーされる配列と新しい配列の長さという 2 つの引数を受け取ります。

ファイル名: 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); } } 

出力:

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

5.UnsupportedOperationException

このプログラムでは、Collections.unmodifiableList メソッドを使用して Java で不変リストを作成する方法を示します。さらに、List を変更しようとしたときにスローされる UnsupportedOperationException を処理する方法も示します。

解決策を見つける手順は次のとおりです。

  1. まず、可変のものを作成します 配列リスト を使用したいくつかの初期要素を含む メソッド。不変のリストを返します。次にこれを渡します 配列リストCollections.unmodifiableList メソッド。リストの不変ビューを返します。
  2. を使用して不変リストを変更しようとします。 削除を追加 、 そして セット リストは不変であるため、リストを変更しようとするとエラーがスローされます。 UnsupportedOperationException
  3. 私たちはそれを捕まえます UnsupportedOperationException これがスローされ、どの操作が試行され失敗したかを示すメッセージがコンソールに出力されます。

注意してください。 Collections.unmodifiableList このメソッドは、元のリストの不変ビューのみを作成します。元のリストが変更された場合、不変ビューにはそれらの変更が反映されます。いかなる手段でも変更できない真に不変のリストを作成するには、 リスト List を変更しようとすると例外をスローするインターフェイス。

実装:

ファイル名: 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()); } } } 

出力:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() は、既存のリストの変更不可能なビューを作成する Java Collections Framework のメソッドです。変更不可能な List を変更しようとすると、UnsupportedOperationException が発生すると推測できます。元のリストは引き続き変更でき、変更は変更不可能なリストに反映されます。

このプログラムでは、Collections.unmodifiableList() メソッドを利用して、変更可能なリストの変更不可能な表現を生成する方法を紹介します。

解決策を見つける手順は次のとおりです。

  1. 変更可能なリストを作成する 可変リスト そして、それを使用していくつかの要素を追加します 追加() の方法 配列リスト
  2. 可変リストの変更不可能なビューを作成する 可変リスト を使用して 変更不可能なリスト() メソッドを作成し、それを変数に代入します 変更不可能なリスト
  3. 変更不可能なリストを変更しようとしました 変更不可能なリスト を使用して 追加() 変更不可能なリストは読み取り専用であるため、これにより UnsupportedOperationException 。この例外をキャッチすると、メッセージがコンソールに出力されます。
  4. 元の可変リストを変更する 可変リスト を使用して別の要素を追加することで、 追加()
  5. 変更可能なリストと変更不可能なリストの両方をコンソールに出力して、変更不可能なリストが元の変更可能なリストに加えられた変更を反映していることを示します。

ファイル名: 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] } } 

出力:

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

ImmutableList の利点

ImmutableList には次のようないくつかの利点があります。

jqueryこのクリック
    スレッドセーフ:ImmutableList は不変であるため、本質的にスレッドセーフです。複数のスレッドは、スレッドの干渉やメモリの不一致のリスクなしに同じリストにアクセスできます。安全:不変リストはセキュリティ上の脆弱性が発生しにくくなります。たとえば、攻撃者が要素を追加または削除してリストを変更しようとしても、リストは不変であるため、変更することはできません。パフォーマンス:不変リストは読み取り専用であるため、キャッシュしてパフォーマンスを向上させることができます。リストに複数回アクセスする必要がある場合は、毎回新しいリストを作成する代わりに不変リストを使用すると、オーバーヘッドを回避できます。予測可能性:不変リストは変更できないため、その動作は予測可能です。不変リストを使用する利点としては、防御的なプログラミングの必要性がなくなり、コードの推論が容易になることが挙げられます。コーディングを簡素化します。不変リストを使用すると、同期、防御的コピー、およびエラーが発生しやすい手動のメモリ管理の必要性がなくなるため、コーディングが簡素化されます。このアプローチの結果、コードの保守が容易になり、見た目もすっきりしました。テストを容易にします:不変リストは内容が変わらないため、テストが容易です。このアプローチにより、考えられるすべてのシナリオとエッジケースをカバーするテストの作成が容易になります。