テーマ
要素数が可変のListはとても便利だ。今回は初期値が決まっている場合のListの作成方法について考察してこう。
配列だったら
例えば配列だったら、変数宣言と同時であればとても簡単に配列の要素を設定することができる。
String[] names = {"John","Paul","George","Ringo" };
今回はこういったことがListで行いたい場合についての考察を行う
List での初期値の設定方法
では本題に入ろう。
① List.of()
作成したリストの変更(追加、削除、変更)がない場合はList.ofメソッドでの作成が簡単だ。(List.ofの戻り値はImmutableList->変更不可リスト)
List<String> names = List.of("John","Paul","George","Ringo");
要素が確定していて、変更がない場合にはこれがもっともシンプルに記述できる。
② Arrays.asList()
要素数は変わらないが、内容が書き換わる可能性がある場合にはArrays.asListを使う。(asListの戻り値はAbstractList -> 追加、削除不可リスト)
List<String> names = Arrays.asList("John","Paul","George","Ringo");
//変更OK
names.set(3, "Peter");
//追加は実行時エラー
names.add("Ben");
この方法で作成したリストは要素を追加すると実行時エラーが発生するので注意
③ コンストラクタにList.ofを渡す
いやいやリストなんだから、追加や変更、削除を自由にさせてよ!という意見はごもっともだ。その場合はArrayListなどのコンストラクタに先程のList.ofで作成したリストを渡す。少し記述が長くなってしまうがこの方法の汎用性は高い
List<String> names = new ArrayList<>(List.of("John","Paul","George","Ringo"));
//変更OK
names.set(3, "Peter");
//追加OK
names.add("Ben");
④ 匿名クラスとイニシャライザを使う
少しマニアックな方法だが匿名クラスとイニシャライザを使って以下のように作成する方法もある。
List<String> names = new ArrayList<>() {
{
add("John");
add("Paul");
add("George");
add("Ringo");
}
};
//変更OK
names.set(3, "Peter");
//追加OK
names.add("Ben");
ただ、この方法は記述量が多く、普通にArrayListを作成してaddしていくのとたいして変わらないであまりメリットはない感じだ。
まとめ
2023年の現状だと、リストに初期データを入れるのは③のコンストラクタにList.ofで作成したリストを入れる方法が良さそうだ。
ただ、冗長な感じがするのは否めないので、今後のJavaの進化に期待したいところだ。
コメント