1. 序章

このチュートリアルでは、Javaで不変セットを構築するさまざまな方法を見ていきます。

しかし、最初に、不変のセットを理解し、なぜそれが必要なのかを見てみましょう。

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

一般に、不変オブジェクトは、一度作成すると内部状態を変更しません。これにより、デフォルトでスレッドセーフになります。 同じ論理が不変のセットに適用されます。

いくつかの値を持つHashSetインスタンスがあるとしましょう。 不変にすると、セットの「読み取り専用」バージョンが作成されます。 したがって、その状態を変更しようとすると、UnsupportedOperationExceptionがスローされます。

では、なぜそれが必要なのですか?

確かに、不変セットの最も一般的なユースケースはマルチスレッド環境です。 したがって、同期を気にすることなく、スレッド間で不変のデータを共有できます。

一方、覚えておくべき重要な点があります。不変性はセットにのみ関係し、その要素には関係しません。 さらに、set要素のインスタンス参照を問題なく変更できます。

3. コアJavaで不変セットを作成する

コアJavaクラスだけを自由に使用できるので、 CollectionsunmodizableSet()メソッドを使用して、元のSetをラップできます。

まず、単純な HashSet インスタンスを作成し、String値で初期化します。

Set<String> set = new HashSet<>();
set.add("Canada");
set.add("USA");

次に、コレクション unmodizableSet():でまとめましょう。

Set<String> unmodifiableSet = Collections.unmodifiableSet(set);

最後に、 unmodizableSet インスタンスが不変であることを確認するために、簡単なテストケースを作成しましょう。

@Test(expected = UnsupportedOperationException.class)
public void testUnmodifiableSet() {
    // create and initialize the set instance

    Set<String> unmodifiableSet = Collections.unmodifiableSet(set);
    unmodifiableSet.add("Costa Rica");
}

予想どおり、テストは正常に実行されます。 さらに、 add()操作は unmodizableSet インスタンスで禁止されており、UnsupportedOperationExceptionをスローします。

次に、同じ値を追加して、最初のsetインスタンスを変更しましょう。

set.add("Costa Rica");

このようにして、変更不可能なセットを間接的に変更します。 したがって、 unmodizableSet インスタンスを出力すると、次のようになります。

[Canada, USA, Costa Rica]

ご覧のとおり、「コスタリカ」アイテムはunmodizableSetにも存在します。

4. Java9で不変セットを作成する

Java 9以降、 Set.of(elements)静的ファクトリメソッドを使用して、不変のセットを作成できます。

Set<String> immutable = Set.of("Canada", "USA");

5. グアバで不変のセットを作成する

不変セットを作成するもう1つの方法は、GuavaのImmutableSetクラスを使用することです。 既存のデータを新しい不変のインスタンスにコピーします。 その結果、元の Set を変更しても、ImmutableSet内のデータは変更されません。

コアJava実装と同様に、作成された不変インスタンスを変更しようとすると、UnsupportedOperationExceptionがスローされます。

それでは、不変のインスタンスを作成するさまざまな方法を見ていきましょう。

5.1. ImmutableSetを使用します。のコピー()

簡単に言うと、 ImmutableSetcopyOf()メソッドは、セット内のすべての要素のコピーを返します。

Set<String> immutable = ImmutableSet.copyOf(set);

したがって、初期セットを変更した後、不変インスタンスは同じままになります。

[Canada, USA]

5.2. 使用する ImmutableSet。の()

同様に、 ImmutableSet.of()メソッドを使用すると、指定された値を使用して不変のセットを即座に作成できます。

Set<String> immutable = ImmutableSet.of("Canada", "USA");

要素を指定しない場合、 ImmutableSet.of()は空の不変セットを返します。

これは、Java9のSet .of()。と比較できます。

6. 結論

このクイック記事では、Java言語の不変セットについて説明しました。 さらに、コアJava、Java 9、およびGuavaライブラリのCollectionsAPIを使用して不変のセットを作成する方法を示しました。

最後に、いつものように、この記事の完全なコードはGitHub入手できます。