無名パターンと無名変数(JEP443)-Preview
プログラムを記述していると、利用しない変数にもかかわらずどうしても宣言が必要になるケースなどがあります。また、他の言語では利用しないということを明示的に分かるようにあえて特別な変数名として宣言するケースがあります。Javaでもこれと同じようなことができるようになり、リスト9のように利用します。
var list = new ArrayList<Point>(); // (省略) // (1) 最初の利用 var _ = list.removeFirst(); // (2) 2回目以降 var _ = list.removeLast(); // (3) コンパイルエラー _.x();
利用しない変数は(1)のようにアンダーバー(_)を変数名として宣言します。そして、再度、利用しない変数があっても(2)のように重複して宣言が可能です。もちろん、使用しない変数として宣言しているので、(3)のような使い方はできず、コンパイルエラーとなります。
この無名変数はtry-catchでのエラー取得でも利用が可能です。
var list = new ArrayList<Point>(); try{ throw new Exception("error"); } catch(Exception _){ System.out.println("!!Error!!"); }
ここまでの利用用途であれば必要ないという方もいるかもしれません。しかし、これが前述したレコードパターンなどと組み合わせると便利になります。
record Point(int x,int y){}; record Line(Point start, Point end){}; // (省略) var p1 = new Point(0,0); var p2 = new Point(100,100); var line = new Line(p1,p2); // (1) 無名変数を使わないケース if(line instanceof Line(Point(int x,int y),Point p)){ System.out.println("line x1:" + x ); } // (2) 無名変数を使うケース if(line instanceof Line(Point(int x, _), _)){ System.out.println("line x1:" + x ); }
無名変数を使わない場合には(1)のように使わない変数についてもすべて定義をしていました。ただし、これでは記述が長くなるというデメリットもありますが、それ以上にどの変数を使うのかはその後の実装を見ないと判断できません。しかし、(2)のような無名変数を使うことで記述も簡素になり、かつ、利用する変数もより明確になります。
mainメソッドの改善(JEP445)-Preview
Javaでプログラムを実行する場合には、リスト12のようにクラス定義の中にmainメソッドを記述していました。
package jp.enbind.jep443; // (省略) public class Main { public static void main(String[] args) throws Exception{ // (省略) } }
このような指定が必要ということは、実行の際にも必ずパッケージ名を含めてクラス名を指定する必要がありました。しかし、今回の変更ではパッケージ名もクラス宣言も必要なくmainメソッドが記述できるようになります。
// ファイル名はsrc/main/java/jp/enbind/jep445/Main.javaという前提 void main(String[] args){ // (処理) }
また、mainメソッドはこれまでと同様に必ずしも引数宣言もいりません。また、パッケージ宣言はできません。そして、コンパイルするとソースコードのファイル名がクラス名になるので、実行する際にはリスト14のように行います。
// (1) コンパイル済みのクラスを実行する場合 java -cp [クラスパス] --enable-preview Main // (2)ソースから直接実行する場合 java --source 21 --enable-preview src/main/java/jp/enbind/jep445/Main.java
(1)がコンパイル済みのclassファイルから実行する場合です。「--enable-preview」オプションは、Java21においてはまだpreview版のために必要なオプションです。そして、(2)がソースのまま実行する場合の実行例です。こちらも同様に「--source 21 --enable-preview」というオプションをつける必要があります。
実際のプロジェクトでは依存する外部ライブラリなども多く、また、何らかのフレームワーク上で動作させることが多いので、実業務としては大きな恩恵はないとは思います。しかし、ちょっとしたコードの動きを確認したい場合や、Javaを勉強している時などではこのような対応は便利だとは思います。
まとめ
Java21の変更内容は主にProject Amberの内容であり、それはつまり、コードを記述する際の容易さと読みやすさを提供してくれるものです。これらを組み合わせて記述することで、より便利に記述でき、そして、より読みやすいコードが記述できるようになります。
ただし、今回のリリースでは文字列テンプレートと無名変数などがPreview版も含まれます。そのため、すべての機能を問題なく利用できるようになるためにはもう少々様子を見る必要があります。
また、今回紹介した内容は、実現可能なコード表現をすべてカバーしたものではないため、詳しくはJDK21の変更点やProject Amberなどを合わせて参考にしてください。