【Java学習|初心者向け】Java 9から始める!不変(Immutable)コレクションで安全なコードを書く方法

1. 導入:なぜ「不変コレクション」が重要なのか

Java開発において、誤ってデータを書き換えてしまい、予期せぬバグを引き起こした経験はありませんか?特に、複数の場所から参照されるリストやマップの内容が勝手に変更されると、原因の特定が非常に困難になります。Java 9で導入された List.of, Set.of, Map.of は、「一度作成したら変更できない(不変)」コレクションを簡単に生成するための機能です。これにより、コードの安全性が飛躍的に高まり、バグの温床を未然に防ぐことができます。

2. 基礎知識:不変(Immutable)コレクションとは

不変コレクションとは、作成後に要素の追加、削除、置換が一切できないオブジェクトのことです。もし要素を変更しようとすると、UnsupportedOperationException が発生します。
従来の java.util.ArrayList などは「可変」であり、意図しない変更を許してしまいます。一方、ofメソッドで作成されたコレクションは最初から変更を禁止することで、スレッドセーフなプログラムを書きやすくし、予期せぬ副作用を排除できるという大きなメリットがあります。

3. 実装・解決策:効率的な記述方法

これまでJava 8以前では、コレクションに値を入れて不変にするには、Arrays.asList() を使った後に Collections.unmodifiableList() でラップするなどの冗長な記述が必要でした。Java 9以降は、わずか1行で、しかも直感的に記述可能です。

4. サンプルプログラム

以下のコードをコピーして実行してみてください。不変コレクションの作成と、誤って変更しようとした時の動作を確認できます。


import java.util.List;
import java.util.Map;
import java.util.Set;

public class ImmutableExample {
public static void main(String[] args) {
// 1. 不変リストの作成
List fruits = List.of("Apple", "Banana", "Orange");
System.out.println("リスト: " + fruits);

// 2. 不変セットの作成
Set numbers = Set.of(1, 2, 3);
System.out.println("セット: " + numbers);

// 3. 不変マップの作成
Map config = Map.of("Host", "localhost", "Port", "8080");
System.out.println("マップ: " + config);

// 注意点: 以下の行を実行すると UnsupportedOperationException が発生します
// fruits.add("Grape");
}
}

5. 応用・注意点:現場での活用ポイント

現場で活用する上で、以下の3点を押さえておきましょう。

・null値は許容されない
List.of などで作成するコレクションの要素に null を含めると、NullPointerException が発生します。null を扱う必要がある場合は、従来の ArrayList などを使用してください。
・要素数に応じたオーバーロード
Map.of は最大10ペアまで引数を受け取れます。それ以上の要素を扱う場合は、Map.ofEntries() を使用するのが定石です。
・「不変」と「読み取り専用」の違い
これらは「不変(Immutable)」であり、元のコレクション自体が変更されることはありません。もし動的に中身を変化させる必要がある場合は、無理にこれらを使わず、ArrayList などを使用し、必要に応じて Collections.unmodifiableList() で公開範囲を制限する設計を検討してください。

不変コレクションを使いこなすと、コードの意図が明確になり、自信を持ってリリースできる堅牢なアプリケーションに近づきます。ぜひ今日から積極的に取り入れてみてください。

コメント

タイトルとURLをコピーしました