【Java 23リリース】Project Amberの新しい機能でより自然なコーディングがしやすくなる
第6回 Javaのバージョンアップの大きな流れと主なツールの変更点
ダウンロード サンプルファイル (5.6 KB)
前回の記事で現在のJavaのバージョンアップに影響を与えるプロジェクトについて紹介しました。その中でもっともJava開発者に影響を与えるのが、Project Amberです。今回は、そのProject Amberでの変更点を中心にJava開発者に影響を与えると思われる新機能や変更点について紹介します。
面倒なmainメソッドをより簡単にする(JEP477 - Third Preview)
Javaプログラムを実行する場合、必ずmainメソッドが必要になり、そのたびにリスト1の記述をすることになります。
public class Jep477 {
public static void main(String args[]){
// ここで実際の処理を記述
}
}
Javaはコンパイル言語であり、また、ある程度のコード量があるプロジェクトで多く使われてきました。その中で、上記の書き方に多少煩わしさを感じても、一度だけ記述すればよいので実際にはそれほど大きな問題にはなりませんでした。
しかし、前回の記事で紹介したマルチファイル・ソースコード・プログラムの起動のように、Javaがスクリプト言語と同じ感覚で使えるようになりつつあります。そうなると、このmainメソッドの煩わしさの課題が顕著になってきます。今回の修正では、この課題に対する対応がされています。
例えば、以下は簡略化の例です。
public class Jep477 {
private String name = "";
// (1) staticメソッドである必要がなくなった
void main(){
System.out.println("test");
// (2) thisにアクセスが可能
this.name = "world";
test1();
}
protected void test1(){
System.out.println("method : " + this.name);
}
}
まず、(1)のようにmainメソッドがstaticメソッドである必要がなくなりました。そして、それに伴い(2)のようにnewをすることなくthisにアクセス可能になりました。
しかし、ここまでできるとなると、このクラス定義すらも書きたくないと思う方もいるでしょう。そういった書き方をしたのがリスト3です。つまり、よりスクリプト的な書き方がしやすくなったのです。
import java.lang.System.Logger;
void main() {
// (1) java23から java.io.IOクラスが追加され、クラス名などを指定せず、関数のように使える
// 以下のインポートが暗黙的にされていることと同義
// import static java.io.IO.*;
println("test");
// (2) インポートしたクラスの使い方(これまで通り)
Logger logger = System.getLogger("app");
logger.log(Logger.Level.INFO,"main start");
// 省略
}
スクリプトのように使う場合には、より短く、より簡単に記述できることが重要になるため、System.out.printlnなども記述が長すぎます。そこでjava.io.IOクラスが導入されました。IOクラスでは、コンソール上の入出力を制御するstaticメソッドがまとめられています。
| メソッド | 説明 |
|---|---|
| static void print(Object obj) | 指定したオブジェクトの文字情報をシステムコンソールに表示する |
| static void println(Object obj) | 指定したオブジェクトの文字情報と改行をシステムコンソールに表示する |
| static String readln(String prompt) | 指定した文字列をシステムコンソールに出力し、システムコンソール上からの一行での入力を受け付ける |
しかも、IOクラスは暗黙的にstaticインポートされます。つまり、「import static java.io.IO.*;」が暗黙的に付与されます。これによって、明示的にインポートすることなく、関数的な呼び出しが可能になります。
java.baseモジュールの暗黙インポート
先述したjava.io.IOクラスのメソッドだけではなく、java.baseモジュールのクラスはimportせずに利用できます。java.baseモジュールには、よく利用するパッケージが含まれます。
void main() {
// 省略
// (1) java.base モジュールに属するクラスは import せずに使える
File file = new File("test/sample.txt");
Instant now = Instant.now();
Date data = new Date();
}
したがって、(1)のように何も宣言せずに使えるため、ListやMapといったインターフェースやFileなどの基本的なクラスはimportせずに利用することが可能です。
この記事は参考になりましたか?
- 【最新Javaアップデート解説】変更点と過去バージョンからのおさらい連載記事一覧
-
- 【Java 25リリース】JFR(Java Flight Recorder)の改善点を紹介
- 【Java 25リリース】シンプルになったコーディングや、堅牢になった並列処理を紹介
- 【Java 23リリース】Project Amberの新しい機能でより自然なコーディングが...
- この記事の著者
-
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編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
