広告

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 メソッドを使ってみましょう。
下記のコードで使っている ListPath は、どちらも 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さんの時間が使われることになります。

無名変数を使えば、質問をするまでもなく意図が読み取れるので、余計な時間を使うこともないわけですね!

もちろん、無名変数を使わなくてもコメントでちゃんと補足しておけばよいのかもしれません。
しかし、コメントより無名変数を使った方がより明確になるでしょう。

関連記事 : コメントが少なくて済むコードを目指そう

まとめ

変数を宣言したけど、その変数は使わない … というケースはそんなに多くないかもしれません。
しかし、もしそのようなケースであれば、積極的に無名変数を使っていきましょう。

ソースコードの読みやすさ向上につながるはずです。
デメリットも特にありません。

ぜひ有効に活用していきたいですね。


関連記事

ページの先頭へ