導入
Javaのプログラミングにおいて、リストやセットなどのコレクションを初期化する際、以前は冗長なコードを書く必要がありました。しかし、Java 9で導入されたファクトリーメソッドであるSet.of()やSet.copyOf()を使うことで、コードを劇的に短く、かつ安全に記述できるようになりました。今回は、これらがなぜ重要なのか、そしてどのように使い分けるべきかを解説します。
基礎知識
Javaにおける「不変(Immutable)コレクション」とは、作成後に要素の追加、削除、変更ができないコレクションのことを指します。不変であることは、マルチスレッド環境での安全性向上や、意図しない値の書き換えを防ぐために非常に強力です。
Set.of()は、引数で渡した要素から不変なSetを作成します。一方、Set.copyOf()は、既存のコレクションをコピーして不変なSetを作成します。どちらも、要素としてnullを許可しないという重要な仕様があります。
実装と使い分け
Set.of()は、あらかじめ中身が決まっている定数的なセットを作りたい時に最適です。
Set.copyOf()は、外部から渡されたコレクションが可変(追加や削除ができるタイプ)かもしれない場合に、それを「保護」して不変なコピーとして扱いたい時に使用します。これにより、元のコレクションが後から変更されても、コピーしたSetには影響が出ないというメリットがあります。
サンプルプログラム
以下のコードをコピーして、動作を確認してみてください。
import java.util.HashSet;
import java.util.Set;
public class SetExample {
public static void main(String[] args) {
// 1. Set.of() を使った初期化
// 要素を直接指定して不変なSetを作成します
Set
System.out.println(“Set.ofの結果: ” + fruits);
// 2. Set.copyOf() を使った保護
// 既存の可変セットから不変なセットを作成します
HashSet
mutableSet.add(“Java”);
mutableSet.add(“Python”);
Set
System.out.println(“Set.copyOfの結果: ” + immutableCopy);
// 注意点:以下のコードを実行すると UnsupportedOperationException が発生します
// immutableCopy.add(“C++”);
}
}
応用・注意点
現場で活用する際の重要な注意点が3つあります。
1. nullの禁止: 要素にnullを含めると、実行時にNullPointerExceptionが発生します。コレクションにnullが入る可能性がある場合は、あらかじめフィルタリングが必要です。
2. 変更不可: これらのメソッドで作ったSetに対して、add()やremove()を呼び出すとUnsupportedOperationExceptionが投げられます。「変更したい」という要件がある場合は、new HashSet<>(Set.of(…))のように、一度別のコレクションに詰め替える必要があります。
3. 重複の扱い: Set.of()に同じ値を複数渡すと、実行時にIllegalArgumentExceptionが発生します。重複を排除したい場合は、一度HashSet等を経由してからcopyOfを使うのが安全です。
これらのメソッドを適切に使うことで、バグの少ないクリーンなコードを書くことができます。ぜひ日々の開発に取り入れてみてください。

コメント