S-JIS[2023-09-23/2024-09-24] 変更履歴

mainメソッド簡略化(Java21〜24)

Java21〜24のmainメソッド簡略化(プレビュー版)について。


概要

2023/9/19にリリースされたJava21で、プレビュー版としてmainメソッドが簡略化できるようになった。

従来は、javaコマンドによって実行が開始されるメソッドは、「public static void main(String[])」だった。
(JDK1.5(Java5)で、引数には「String...」も可能になったが)
これに対し、public・staticおよび引数(String[])を省略できるようになる。

また、クラスを定義せずにmainメソッドだけでコンパイルできるようになる。
(暗黙のクラス(暗黙に宣言されたクラス)という扱いになる)


Java23(3rdプレビュー)で、暗黙のクラス内では以下のメソッドが(importしなくても)使えるようになった。[2024-09-24]

このためにjava.io.IOというクラスが新設され、そのstaticメソッドとして上記のメソッドが定義されている。
そして、以下のimport文が暗黙に宣言された扱いになる。

import static java.io.IO.*;

さらに、java.util.Listやjava.math.BigDecimal等の、java.baseモジュールに含まれているクラスも暗黙にインポートされる。
これは、モジュールのインポートの構文(これもJava23時点ではプレビュー機能)を使って暗黙に宣言される。

import module java.base;

mainメソッド簡略化はJava21〜24ではプレビュー版の機能なので、この機能を使いたい場合はコンパイル時にjavacコマンドに--enable-previewを付ける必要があり、
また、実行時にjavaコマンドに--enable-previewを付ける必要がある。
JShellで試す場合もjshellコマンドに--enable-previewを付ける。

> javac --enable-preview --release 21 Example.java
> java --enable-preview Example
> java --enable-preview --source 21 Example.java

mainメソッドの例。

パターン 備考
基本(Main.javaのMainクラスを定義) public class Main {
  public static void main(String[] args) {
    System.out.println("main " + args.length);
  }
}
 
クラス定義を省略 public static void main(String[] args) {
  System.out.println("main " + args.length);
}
Main.javaにこれを書いている場合、
コンパイルするとMain.classが生成される。
mainメソッドのpublic・static・引数を省略 void main() {
  System.out.println("main");
}

Java23の「暗黙にインポートされたメソッド」の例。[2024-09-24]

src/ImplicitClassExample.java:

void main() {
    String line = readln("何か入れて");
    println(line);

    var list = List.of(line);
    println(list);

    println(BigDecimal.valueOf(123));
}

暗黙に宣言されたクラスでは、readln()やprintln()といったメソッドが使える。
また、java.util.Listやjava.math.BigDecimal等もimport文無しで使える。

これらは暗黙に宣言されたクラスの場合のみ有効。
すなわち、package文を宣言したり、クラスを定義(class ImplicitClassExample{ })したりすると、使用できない。


実行コマンド

> java --enable-preview --source 23 ImplicitClassExample.java

プレビュー機能へ戻る / Java目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま