SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Javaアップデート解説】変更点と過去バージョンからのおさらい

「Java21」で何ができる? 新機能とJava17以降の変更点を紹介

Java21での新しいAPI、変更点とJava17からのおさらい

  • X ポスト
  • このエントリーをはてなブックマークに追加

無名パターンと無名変数(JEP443)-Preview

 プログラムを記述していると、利用しない変数にもかかわらずどうしても宣言が必要になるケースなどがあります。また、他の言語では利用しないということを明示的に分かるようにあえて特別な変数名として宣言するケースがあります。Javaでもこれと同じようなことができるようになり、リスト9のように利用します。

[リスト9]利用しない値の宣言と利用例(src/main/java/jp/enbind/jep443/Main.javaの抜粋)
var list = new ArrayList<Point>();
// (省略)
// (1) 最初の利用
var _ = list.removeFirst();
// (2) 2回目以降
var _ = list.removeLast();
// (3) コンパイルエラー
_.x();

 利用しない変数は(1)のようにアンダーバー(_)を変数名として宣言します。そして、再度、利用しない変数があっても(2)のように重複して宣言が可能です。もちろん、使用しない変数として宣言しているので、(3)のような使い方はできず、コンパイルエラーとなります。

 この無名変数はtry-catchでのエラー取得でも利用が可能です。

[リスト10]例外処理での無名変数の利用例(src/main/java/jp/enbind/jep443/Main.javaの抜粋)
var list = new ArrayList<Point>();
try{
    throw new Exception("error");
}
catch(Exception _){
    System.out.println("!!Error!!");
}

 ここまでの利用用途であれば必要ないという方もいるかもしれません。しかし、これが前述したレコードパターンなどと組み合わせると便利になります。 

[リスト11]レコードパターンと無名変数を組み合わせた利用例(src/main/java/jp/enbind/jep443/Main.javaの抜粋)
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メソッドを記述していました。

[リスト12]クラス定義内でのmainメソッドの定義例(src/main/java/jp/enbind/jep443/Main.javaの抜粋)
package jp.enbind.jep443;
// (省略)
public class Main {
    public static void main(String[] args) throws Exception{
        // (省略)
    }
}

 このような指定が必要ということは、実行の際にも必ずパッケージ名を含めてクラス名を指定する必要がありました。しかし、今回の変更ではパッケージ名もクラス宣言も必要なくmainメソッドが記述できるようになります。

[リスト13]無名クラスでのmainメソッド記述例(src/main/java/jp/enbind/jep445/Main.javaの抜粋)
// ファイル名はsrc/main/java/jp/enbind/jep445/Main.javaという前提
void main(String[] args){
    // (処理)
}

 また、mainメソッドはこれまでと同様に必ずしも引数宣言もいりません。また、パッケージ宣言はできません。そして、コンパイルするとソースコードのファイル名がクラス名になるので、実行する際にはリスト14のように行います。

[リスト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などを合わせて参考にしてください。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【最新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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/18303 2023/09/21 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング