概要
オブジェクト指向の申し子と言っても過言では無いJavaのmain()関数の実装について大きな変更が追加され公開されたという噂を以前から耳にしていました。先日、ネットで以下の記事を見付けました。記事によると、Javaプログラムのmain()関数の実装は随分シンプルな構文になるとのことです。そこで、実際に記事に掲載されている内容を検証してみることにしました。
現状この変更はプレビュー指定となっており、今後変更される可能性が有ります。
おさらい
従来Javaのmain()関数は、Main.java
ファイルにMain Class
を実装し、public static void
な関数main()関数として実装していました。筆者は、Javaのプログラムは入社した時の研修でやったぐらいで、それ以降は殆どJavaのプログラムは書いていませんが、今でもあのガチガチにオブジェクト指向に則った実装は覚えています。世界で最も有名な?サンプルプログラムHelloWorldを実装すると以下の様になります。
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
因みにC言語とPythonでHelloWorldを実装すると以下の様になります。
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
print('Hello, world!')
これを見るといかにJavaでHelloWorldを実装しようとすると沢山呪文を入力しなければならないか分かります。
ところがこうなった
しかし、この数年でJavaを取り巻く情勢に変化?が訪れたのか、言語仕様に大きな変更が(試験的に)加わりました。Main Class
の実装は不要(ビルド時に暗黙的に追加)となり、そもそもファイル名もMain.java
を強制されないという大盤振る舞い。。。
試みに記事の内容を参考に新しい構文でHelloWorldを実装してみます。以下の様になりました。
static void main() {
System.out.println("Hello, world!");
}
たった三行で書けてしまっています。。。
検証
検証環境
この新しい構文で実装したHelloWorldをNewHelloWorld.java
というファイルに保存した上で、ビルド→実行してみようと思います。今回検証に用いた環境は以下です。
- OS: macOS Sequoia 15.3.2
- JDK: Amazon Corretto 24
ビルド
従来の方法でビルドしようとすると、以下の様にエラーとなります。
$ javac NewHelloWorld.java
NewHelloWorld.java:1: エラー: 暗黙的に宣言されたクラスはプレビュー機能であり、デフォルトで無効になっています。
static void main() {
^
(暗黙的に宣言されたクラスを有効にするには--enable-previewを使用します)
エラー1個
ビルドコマンドは以下の様にオプションを指定して実行します。警告は出力されますが、無事ビルドが出来ました。
$ javac --release 24 --enable-preview -Xlint:preview NewHelloWorld.java
NewHelloWorld.java:1: 警告: [preview] 暗黙的に宣言されたクラスはプレビュー機能であり、今後のリリースで削除される可能性があります。
static void main() {
^
NewHelloWorld.java:1: 警告: [preview] IOはプレビューAPIであり、今後のリリースで削除される可能性があります。
static void main() {
^
警告2個
従来のMain Class
の方式で実装したmain()関数をMain.java
ではないファイル名で保存し、ビルドしようとすると以下の様に、ビルドエラーになります。
$ javac test.java
test.java:1: エラー: クラス Mainはpublicであり、ファイルMain.javaで宣言する必要があります
public class Main {
^
エラー1個
実行
以下の様に、実行時にも--enable-preview
が必要です。無事Hello, world!
のメッセージが出力されました。
$ java --enable-preview NewHelloWorld
Hello, world!
まとめ
以前から噂を耳にして気になっていたJavaの新構文を試してみました。プレビュー機能ということで今後正式に採用されるか分かりませんが、正式に導入されれば、少なくともmain()関数の実装は楽になるのではないかと思います。
とても詳しく経緯をまとめられている素晴らしい記事を見付けたので参考資料として掲載します。
余談ですが、Amazon CorrettoはAmazon版のOpenJDKとのことで、筆者はつい最近知りました。Oracle OpenJDKからの乗り換え先を探していた所だったので、今後は贔屓にさせてもらおうと思います。サポート期間もOracle OpenJDKより一般に長い様です。但し、Correto 24は今年の10月までのサポートなので次のLTS版に今後アップグレード予定です。(この新構文がプレビュー機能から正式機能になりますように