面倒な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せずに利用することが可能です。