Java : 無名変数の使い方
本記事では、Java 22 で追加された 無名変数 の基本的な使い方を解説します。
概要
無名変数とは、
- 変数の宣言は必要だけど、その変数は使わない
というときに使う変数です。
無名変数の宣言には、アンダーバー (_) を使います。
int _ = 123;
こんな感じですね。
もちろん使わない前提の変数なので、_ にアクセスするとエラーになります。
int _ = 123; // 無名変数の宣言はOK
_ = 456; // 代入するとエラー!
System.out.println(_); // 表示しようとしてもエラー!
try-catch文で使う例
もう少し具体的な例も見てみましょう。
例えば、try-catch 文で例外をキャッチします。
しかし、その例外の変数は使わない、というケースはたまにあると思います。
【従来の書き方】
final var path = Path.of("D:", "java-work", "test.txt");
System.out.println(path); // D:\java-work\test.txt
try {
Files.createFile(path);
} catch (IOException e) {
System.out.println("ファイル作成に失敗");
}
try-catch 文で例外をキャッチするには、必ず 例外としての変数宣言が必要です。
しかし、せっかく宣言した変数 e ですが、今回のように使わないこともあります。
catch (IOException e)
^^^^^^^^^^^^^ <--- この部分!
【無名変数を使う書き方】
try {
Files.createFile(path);
} catch (IOException _) {
System.out.println("ファイル作成に失敗");
}
無名変数を使えば、IOException の変数は使わない、ということが 明示 できます。
catch (IOException _)
^^^^^^^^^^^^^ <--- この部分!
拡張for文の例
拡張for文 の例も見てみましょう。
例として getIterableSize メソッドを作ります。
Iterable オブジェクトをパラメータに受け取って、そのサイズを返します。
public <T> int getIterableSize(Iterable<T> it) {
int size = 0;
for (var _ : it) {
size++;
}
return size;
}
サイズを算出したいだけなので、Iterable の要素がなんであるかは気にしません。
よって、無名変数が使えるわけですね。
for (var _ : it) {
^^^^^ <--- この部分!
それでは、実際に getIterableSize メソッドを使ってみましょう。
下記のコードで使っている List と Path は、どちらも Iterable を実装しています。
final var list = List.of("a", "b", "c");
System.out.println(list); // [a, b, c]
final var size1 = getIterableSize(list);
System.out.println(size1); // 3
final var path = Path.of("dir", "test.txt");
System.out.println(path); // dir\test.txt
final var size2 = getIterableSize(path);
System.out.println(size2); // 2
メリット
無名変数を使うことで、その変数を 使わない ことが 明示 できます。
つまり、コードを書いたひとの意図 (その変数は使わない) が込められるわけですね。
あとは、間違ってその変数を使ってしまっても、無名変数であればビルドエラーになります。
無名変数がないと、例えばAさんがコードを読んでいる時に…
- Aさん「あれ、Bさんのこのコード、変数 x を宣言だけして使ってないけど意図的なのかな? それとも間違いなのかな?」
という疑問が出てくるかもしれません。
必要であれば、AさんからBさんへ質問がいくでしょう。
しかし、それは貴重なAさんとBさんの時間が使われることになります。
無名変数を使えば、質問をするまでもなく意図が読み取れるので、余計な時間を使うこともないわけですね!
もちろん、無名変数を使わなくてもコメントでちゃんと補足しておけばよいのかもしれません。
しかし、コメントより無名変数を使った方がより明確になるでしょう。
関連記事 : コメントが少なくて済むコードを目指そう
まとめ
変数を宣言したけど、その変数は使わない … というケースはそんなに多くないかもしれません。
しかし、もしそのようなケースであれば、積極的に無名変数を使っていきましょう。
ソースコードの読みやすさ向上につながるはずです。
デメリットも特にありません。
ぜひ有効に活用していきたいですね。
関連記事
- if文の基本
- while文の基本
- for文の基本
- プリミティブ型 (基本データ型)
- リテラルの表記方法いろいろ
- クラスの必要最低限を学ぶ
- インタフェースの default メソッドとは
- インタフェースの static メソッドの使いどころ
- var (型推論) のガイドライン
- アクセス修飾子の基本
- 配列 (Array) の使い方
- 拡張for文 (for-eachループ文)
- switch文ではなくswitch式を使おう
- try-with-resources文でリソースを自動的に解放
- テキストブロックの基本
- 列挙型 (enum) の基本
- ラムダ式の基本
- レコードクラスの基本 (Record Class)
- メソッド参照の基本
- シールクラスの基本(Sealed Class)