1. 導入:なぜこのメソッドが重要なのか
Java開発において、要素が1つしかないリストやセットを生成するために「Arrays.asList()」や「new ArrayList<>()」を使っていませんか?これらは動的な追加・削除を前提としたオブジェクトを生成するため、要素が1つしかない場合にはメモリの無駄が生じます。
「Collections.singleton系」メソッドは、「不変(イミュータブル)で、かつ要素が1つしかない」という条件に特化して最適化されたコレクションを生成します。メモリ消費を抑えつつ、コードの意図を明確にするために非常に重要なTipsです。
2. 基礎知識:singleton系の仕組み
Collectionsクラスが提供するsingletonメソッド(singleton, singletonList, singletonMap)は、以下の特徴を持っています。
・省メモリ: 内部的に最小限のフィールドしか持たない専用のクラスを返します。
・不変(Immutable): 要素の追加、削除、置換はできません。呼び出すとUnsupportedOperationExceptionが発生します。
・高速な検索: 要素が1つしかないことが保証されているため、内部処理も極めてシンプルです。
3. 実装と解決策
これらのメソッドは、特に「あるメソッドの引数として、単一の要素をコレクションに包んで渡す必要がある場合」に真価を発揮します。
例えば、ストリームAPIで処理した結果を単一のリストとして後続に渡す場合や、設定値として1つの値をMapに格納して渡す際に、余計なオーバーヘッドなしで安全に受け渡しが可能です。
4. サンプルプログラム
import java.util.;
public class SingletonExample {
public static void main(String[] args) {
// 1. リスト: 要素が1つの不変リストを作成
List
// 2. セット: 要素が1つの不変セットを作成
Set
// 3. マップ: キーと値が1つずつの不変マップを作成
Map
// 使用例
System.out.println(“リストの内容: ” + singleList);
System.out.println(“セットの内容: ” + singleSet);
System.out.println(“マップの内容: ” + singleMap);
// 注意: 以下の操作を行うと UnsupportedOperationException が発生します
// singleList.add(“Python”);
}
}
5. 応用・注意点:現場で陥りやすい罠
実務で扱う際に、以下の3点に注意してください。
・要素の変更は不可: 前述の通り、これらは「不変」です。後から要素を追加する可能性がある場所で使ってしまうと、実行時エラー(UnsupportedOperationException)を誘発します。
・nullの扱い: singletonListやsingletonはnullを要素として保持できますが、singletonMapのキーにnullを指定するとNullPointerExceptionが発生する場合があります。
・Java 9以降のList.of(): Java 9以降であれば、`List.of(“A”)` や `Set.of(“A”)` も利用可能です。これらは「要素が0個以上」に対応しており、より柔軟ですが、singleton系は「確実に1つであること」をコード上で明示できるため、読み手に対して「このリストは今後も要素数が増えることはない」という強い意思表示が可能です。
状況に応じて、これらの軽量なコレクションを使い分けることで、バグの少ない、堅牢なJavaコードを書くことができます。ぜひ日々の実装に取り入れてみてください。

コメント