1. 導入:なぜ不変(イミュータブル)リストが重要なのか
Java開発において、リストの内容を「後から変更させない」ことは、バグを減らすための非常に重要なテクニックです。特にマルチスレッド環境や、データの意図しない書き換えを防ぎたい場合に、不変(イミュータブル)なコレクションは必須の知識です。今回は、Java 9で導入された List.of() と、Java 10で導入された List.copyOf() を使って、安全なリスト作成を行う方法を解説します。
2. 基礎知識:List.of()とList.copyOf()とは
どちらも「中身を変更できないリスト」を作成するためのメソッドですが、用途が異なります。
List.of():要素を指定して、その場で新しい不変リストを作成します。
List.copyOf():既存のコレクションから、その内容をコピーした不変リストを作成します。
これらのメソッドで作られたリストに add() や remove() を行うと、UnsupportedOperationException(操作非対応例外)が発生します。つまり、プログラムの実行中に勝手にリストが書き換わる心配がない、安全なリストが作れるということです。
3. 実装/解決策:使い分けのポイント
基本的には、リストを新しく作るなら List.of() を使い、外部から渡されたリストを「安全な形にして保持したい」場合は List.copyOf() を使います。
また、重要な注意点として、これらのメソッドで作成されたリストには「null」を含めることができません。nullを入れようとすると NullPointerException が発生するため、データの品質を強制的に保つことができます。
4. サンプルプログラム
以下のコードをコピーして、ご自身の環境で試してみてください。
import java.util.ArrayList;
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
// 1. List.of() による作成
// 要素を直接指定して、読み取り専用のリストを作成します
List
System.out.println(“リスト: ” + fruits);
// 2. List.copyOf() による作成
// 既存のリストをコピーして、安全な不変リストを作成します
List
mutableList.add(“Java”);
mutableList.add(“Python”);
List
System.out.println(“安全なリスト: ” + safeList);
// 3. 注意点:変更を試みると例外が発生します
try {
safeList.add(“Ruby”); // ここでエラーになります
} catch (UnsupportedOperationException e) {
System.out.println(“エラー: 不変リストは変更できません!”);
}
}
}
5. 応用・注意点:現場で陥りやすいバグの回避
現場でよくある失敗は、「元のリストを書き換えたら、不変リストの中身も変わってしまうのでは?」と心配することです。List.copyOf() は「内容をコピー」するため、元のリストが後から変更されても、作成済みの不変リストには影響を与えません。これは外部から受け取ったデータをクラス内で保持する際、非常に安全な手法です。
ただし、注意が必要なのは「参照型」の場合です。リスト自体は不変ですが、リストの中に入っているオブジェクト(例えば自作のクラスなど)が「可変」であれば、そのオブジェクトの中身自体は書き換え可能です。完全に安全なプログラムを作るには、中身のオブジェクトも不変(イミュータブル)にしておくのが、シニアエンジニアとしての推奨設計です。

コメント