Javaの不変セット

1. 前書き

このチュートリアルでは、* Javaで不変セットを構築するさまざまな方法を見ていきます。*
しかし、まず、不変のセットを理解し、それが必要な理由を見てみましょう。

2. 不変セットとは何ですか?

一般に、* an link:/java-immutable-object[immutable object]は、一度作成すると内部状態を変更しません。*これにより、デフォルトでスレッドセーフになります。 同じロジックが不変セットにも適用されます。
いくつかの値を持つlink:/java-hashset[_HashSet_]インスタンスがあるとします。 不変にすると、セットの「読み取り専用」バージョンが作成されます。 したがって、その状態を変更しようとすると、_UnsupportedOperationException_ *がスローされます。
それで、なぜそれが必要なのでしょうか?
確かに、「不変セット」の最も一般的な使用例は、マルチスレッド環境です。 したがって、同期を心配することなく、スレッド間で不変データを共有できます。
一方、留意すべき重要なポイントがあります:*不変性はセットにのみ関係し、その要素には関係しません*。 さらに、問題なくセット要素のインスタンス参照を変更できます。

*3. Core Java *で不変セットを作成する

*自由に使えるコアJavaクラスだけで、_Collections _._ unmodifiableSet()_メソッドを使用して元の_Set_をラップできます。*
最初に、単純なlink:/java-hashset[_HashSet_]インスタンスを作成し、_String_値で初期化します。
Set<String> set = new HashSet<>();
set.add("Canada");
set.add("USA");
次に、_Collections _._ unmodifiableSet():_でまとめましょう。
Set<String> unmodifiableSet = Collections.unmodifiableSet(set);
最後に、_unmodifiableSet_インスタンスが不変であることを確認するために、簡単なテストケースを作成しましょう。
@Test(expected = UnsupportedOperationException.class)
public void testUnmodifiableSet() {
    // create and initialize the set instance

    Set<String> unmodifiableSet = Collections.unmodifiableSet(set);
    unmodifiableSet.add("Costa Rica");
}
予想どおり、テストは正常に実行されます。 さらに、unmodifiableSet_インスタンスでの_add()_操作は禁止されており、_UnsupportedOperationException_をスローします。
次に、同じ値を追加して、初期の_set_ instanceを変更します。
set.add("Costa Rica");
このようにして、変更不可能なセットを間接的に変更します。 したがって、_ unmodifiableSet _ instanceを出力すると:
[Canada, USA, Costa Rica]
ご覧のとおり、_“ Costa Rica” _アイテムは_unmodifiableSetにもあります。_

*4. Java 9 *で不変セットを作成する

Java 9以降、_Set.of(elements)_ staticファクトリメソッドを使用して不変セットを作成できます。
Set<String> immutable = Set.of("Canada", "USA");

*5. Guava *で不変セットを作成する

*不変セットを構築できる別の方法は、Guavaの_ImmutableSet_ class *を使用することです。 既存のデータを新しい不変のインスタンスにコピーします。 その結果、元の_Set_を変更しても、_ImmutableSet_内のデータは変更されません。
コアJava実装と同様に、作成された不変インスタンスを変更しようとすると、_UnsupportedOperationException_がスローされます。
それでは、不変インスタンスを作成するさまざまな方法を見てみましょう。

5.1。 ImmutableSet . * copyOf()* を使用

簡単に言うと、_ImmutableSet _._ copyOf()_メソッドは、セット内のすべての要素のコピーを返します。
Set<String> immutable = ImmutableSet.copyOf(set);
したがって、初期セットを変更した後、不変インスタンスは同じままです。
[Canada, USA]

5.2。 * ImmutableSet.of()* を使用

同様に、_ImmutableSet.of()_メソッドを使用すると、指定された値で不変セットを即座に作成できます。
Set<String> immutable = ImmutableSet.of("Canada", "USA");
要素を指定しない場合、_ImmutableSet.of()_は空の不変セットを返します。
これは、Java 9の_Set.of()._と比較できます。

6. 結論

この簡単な記事では、Java言語の不変の_Sets_について説明しました。 *さらに、コアJava、Java 9、およびGuavaライブラリのコレクションAPIを使用して不変の_Sets_を作成する方法を示しました。*
最後に、いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-9 [GitHub]にあります。