1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java25でHello Worldが簡単になった話

Posted at

はじめに

皆さんは初めてHello Worldしたプログラミング言語は何でしたか?

筆者は生まれて初めての挨拶をJavaで済ませましたが、そのお作法には大層苦しめられました。

様々な入門書に書かれている魔法の言葉 "おまじない"
そんなおまじないにアップデートが来たらしいのでちょっと覗いてみましょう。

この記事はTDCソフト株式会社Advent Calendarの14日目の投稿です。

Hello Worldの変遷

慣れ親しんだ Hello World

HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Java歴1年の若手も20年のベテランも慣れ親しんだHello Worldですね。
もはや安心感さえ覚えます。

これだけの為に書くことが多すぎる、とツッコミを入れた日が懐かしいものです。

令和最新版 Hello World

HelloWorld.java
void main() {
    IO.println("Hello World!");
}

多くの記述が省略され、記述量が大幅に減りましたね。
たったこれだけで標準出力が出来るようになりました。

思想

この変更はJEP512(Compact Source Files and Instance Main Methods)によるものです。

JEP(JDK Enhancement Proposal)とは

JDKの機能拡張の提案に関する文書です。
JDKがどういった思想で機能拡張を行ったかが明示されています。

以下JEP512 Summaryより抜粋

Evolve the Java programming language so that beginners can write their first programs without needing to understand language features designed for large programs.

Javaプログラミング言語を進化させ、初心者が大規模プログラム向けに設計された言語機能を理解することなく、最初のプログラムを作成できるようにします。

Far from using a separate dialect of the language, beginners can write streamlined declarations for single-class programs and then seamlessly expand their programs to use more advanced features as their skills grow.

言語の独立した方言を使用するのではなく、初心者は単一クラスのプログラムに対して合理化された宣言を記述し、スキルの向上に合わせてプログラムをシームレスに拡張して、より高度な機能を使用できます。

Experienced developers can likewise enjoy writing small programs succinctly, without the need for constructs intended for programming in the large.

経験豊富な開発者も同様に、大規模プログラミング向けの構造を必要とせずに、簡潔な小規模プログラムを作成できます。

そのうち分かるようになるから今はおまじないと思っていてください。

そう言われて訳もわからず記述するものを減らすことでJavaの最初のプログラムで躓かないようにする試みですね。

クラス宣言もアクセス修飾子も入門レベルの小規模なプログラムではまず使用しない機能なので、訳も分からずおまじないを唱えてきた筆者には今回の変更は魅力的に映ります。

変更内容

クラスの定義が不要に(Compact source files)

クラスの定義を省略できるようになりました。

クラスの定義を省略した際は暗黙的にファイル名と同じクラスが宣言されているものとみなされ、変数やメソッドはクラスのインスタンスメンバとして認識されます。

HelloWorld.java
String val = "Hello World!";

void main() {
    IO.println(val);
}

例えば↑の様な記述は、暗黙的に以下のように認識されます。

class HelloWorld {
    String val = "Hello World!";

    void main() {
        IO.println(val);
    }
}

mainメソッドの簡略化(Instance main methods)

これまでのmainメソッドに比べて以下の変更点があります。

  • アクセス修飾子(public)がない
  • 静的メソッド(static)ではない
  • 引数(String[] args)がない

アクセス修飾子や静的メソッドは入門用の小規模プログラムでは恩恵を受けることがない機能です。
また、引数(String[] args)もmainメソッドの実行時引数であり、入門書レベルであまり触れることのない機能です。

これらの "おまじない" を省略できるようになり、より簡潔な記述でプログラムを実行出来るようになりました。

コンソール操作の簡略化(Interacting with the console)

HelloWorld.java
void main() {
    // java.langパッケージに追加されたIOクラスを使用
    IO.println("Hello World!");
}

System.out.printlnIO.printlnに変わりました。

IOはJDK25から追加されたクラスで、print()println()readln()といった簡単なI/Oメソッドを提供します。
これにより、標準入力の記述量もかなり削減することが出来るようになりました。

標準入力を受け付け、その結果を標準出力するプログラムで比較してみましょう。

JDK24まで
HelloWorld.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HelloWorld {

    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.print("Enter your name: ");
            String name = reader.readLine();
            System.out.println("Hello, " + name + "!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
JDK25以降
HelloWorld.java
void main() {
    IO.print("Enter your name: ");
    String name = IO.readln();
    IO.println("Hello, " + name + "!");
}

java.baseモジュールの自動インポート

コンパクトソースファイルでは、java.baseモジュールが暗黙的にインポートされます。
これにより、java.utiljava.ioといったパッケージをimport文宣言不要で使用可能になっています。

そのため、以下のようにjava.util.Listをimport文なしで使用可能です。

HelloWorld.java
void main() {
    List<String> list = new ArrayList<>();
    IO.print("Enter your name: ");
    String name = IO.readln();
    list.add(name);
    IO.println("Hello, " + name + "!");
}

ちなみに、クラス宣言を使用する場合はimport文なしだとコンパイルエラーになります。
コンパクトソースファイルでなくなるので、暗黙的なインポートが実行されないためです。

HelloWorld.java
public class HelloWorld {
    public static void main() {
        // importがないのでコンパイルエラーになる
        List<String> list = new ArrayList<>();
        IO.print("Enter your name: ");
        String name = IO.readln();
        list.add(name);
        IO.println("Hello, " + name + "!");
    }
}

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?