「Java21」で何ができる? 新機能とJava17以降の変更点を紹介
第4回 Java21での新しいAPI、変更点とJava17からのおさらい
ダウンロード サンプルファイル (5.6 KB)
無名パターンと無名変数(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などを合わせて参考にしてください。
参考資料
この記事は参考になりましたか?
既に会員の方はを行ってください。
- 【最新Javaアップデート解説】変更点と過去バージョンからのおさらい連載記事一覧
- この記事の著者
-
WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)
< WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
