
Java 25の初心者向け機能
こんにちは!
カサレアルでJavaのコースを担当している櫻庭です。
2025年9月16日にJava 25がリリースされます。
現在、JavaのLTS (Long Term Support)のバージョンであるため、現在のLTSであるJava 21やJava 17から、徐々にJava 25へ移行されるはずです。
Javaでは、新しく取り入れる機能をJEP (JDK Enhancement Proposal)で管理しており、Java 25では18のJEPが新機能として取り入れられています。
その中には、Javaの初心者向けの重要な機能があるので、本エントリーではそれを紹介していきます。
初心者向け機能とは
Javaは初心者にとってハードルが高い言語だとよく言われます。
なぜそう言われるのでしょう?
- 記述量が多い
- こういうものだからと理由抜きに書かなければならない記述がある
- 実行までの段階が多い
1つ目は、すぐにお分かりだと思います。たとえば、”Hello, World!”を出力するだけでもメインクラスを書かなければならないなどがこれに相当します。
書くことが多いと、それだけでイヤになってしまいますね。
2つ目は初心者の段階では理由を説明しても理解できないので、理由抜きになってしまう記述があるということです。
たとえば、”Hello, World!”だけ出力するのに、クラスとは何であるのかという説明や、System.outが何かなどを説明しても、結局理解できないので、理由抜きになってしまうわけです。
教える方からしたら「とりあえずお約束だからこう書いておいて」というしかなく、教わる方はなんかモヤモヤしながら書かざるをえないという悪循環になってしまいます。
最後の実行までの段階が多いというのは、ソースを記述してから実行するまでにやらなくてはいけないことが多いということです。
Javaではソースを記述した後にコンパイルする必要があります。スクリプト系の言語であれば、ソースを書けばすぐに実行できるのに対し、Javaではひと手間かける必要があったわけです。
この最後の点については、Java 24までにいろいろと対策が講じられてきました。
たとえば、REPLツールのJShell。
JShellを使えば、コマンドラインで1行ごとに実行することができます。たとえば、”Hello, World!”を出力するのであれば、次のように実行できます。
> jshell
| JShellへようこそ -- バージョン21.0.8
| 概要については、次を入力してください: /help intro
jshell> System.out.println("Hello, World!")
Hello, World!
jshell>
jshell> の後が、コードを入力した部分です。また、JShellでは文末のセミコロンも省略することができます。
JShellを使えば、記述量も減らせますし、いいことづくめのような気もしますが、記述したことコードを後で見直すとか、再利用するといったことには不向きです。
そこで、Java 11で導入されたのが、JEP 330: Launch Single-File Source-Code Programsです。
これによって、1ファイルのソースコードであれば、コンパイルをしないでも実行することができるようになりました。
JEP 330はJava 22で拡張され、複数のファイルでも実行できるようになっています。
では、理由の1つ目と2つ目はどうでしょうか?
これに対応するのがJava 25で導入された2つのJEPです。
JEP 512: Compact Source Files and Instance Main Methods
Javaのプログラムを実行するためには、必ずメインクラスを作成して、mainメソッドを記述する必要があります。クラス名はなんでもかまいませんが、メソッド名はmainにしなければなりませんし、そのシグネチャーも決まっています。
たとえば、”Hello, World!”を出力するだけでも、次に示すようにクラスを作らなければならないわけです。
public class Hello {
public static void main(String... args) {
System.out.println("Hello, World!");
}
}
しかし、初心者にとってこのプログラムを書くには、いくつものハードルがあります。
たとえば、実際に行いたのは出力を行う1行だけなのに、5行も書かなくてはいけないとか。また、クラスやアクセス修飾子、staticなど初心者にとっては説明するのが難しい概念が多く含まれています。
また、System.outも分かりにくいですね。System.out.println(…)を正しく説明するのは、それなりに難しいです。
そこで、これらを省略して書けるようにしましょうというのが、JEP 512: Compact Source Files and Instance Main Methodsです。
JEP 512ではmainメソッドは書かなくてはいけないものの、メインクラスなどを省略可能としました。また、標準入出力を表すクラスとしてjava.lang.IOクラスが導入されています。
では、上記のコードはどのように書けるでしょう。
void main() {
IO.println("Hello, World!");
}
なんと、3行になりました!
しかもmainメソッドのアクセス修飾子やstatic、また引数も省略可能です。また、System.outではなく、IOクラスになっています。
これであれば、初心者にとってハードルがかなり下がるのではないでしょうか。
もちろん、Spring Frameworkなどを使えば、mainメソッドを自分で記述することはほとんどなくなると思いますが、言語を学ぶ一番はじめの段階のハードルが下がるのは確かです。
JEP 511: Module Import Declarations
インポート文も初心者泣かせの記述です。
初期のJavaであればクラス数も少なかったので、どのクラスがどのパッケージで定義されているか調べるのも簡単でした。しかし、今では標準ライブラリであっても、とても多くのクラスが提供されています。
そのため、使用しているクラスのパッケージを調べて記述するのは、とても大変です。もちろん、IDEがあれば自動的に記述してくれますが、ずらずらと並ぶインポート文は読むのも大変です。
また、なぜかJavaではインポート文でアスタリスクを使うのが嫌われてきました。import java.util.*;と記述すれば、java.utilのクラスはすべて使えるのですが、アスタリスクの使用は推奨されずにきてしまいました。
そこで、Java 25ではJEP 511: Module Import Declarationsによって、インポート文をモジュール単位の記述にすることが可能になりました。この場合の記法は次のようになります。
import module M;
Mがモジュール名です。
たとえば、JDBCとHTTPクライアントを使うのであれば、以下のように記述できます。
import module java.sql;
import module java.net.http;
これで、java.sqlモジュールとjava.net.httpモジュールで定義されているクラスを使用することができます。
しかも、初心者が使用するほとんどのクラスはjava.baseモジュールに含まれています。このため、プログラムの先頭にimport module java.base;と書けばよいのですが、これにはまだ続きがあります。
今まで、java.langパッケージのクラスはインポート文を記述せずとも使用することができました。
これを拡張して、前述のJEP 512ではjava.baseモジュールのインポートを省略できるようになっています。
ということは、Javaを学びはじめた初期の段階ではインポート文を書かなくても済むということです。たとえば、java.util.Listやjava.util.Mapなどもインポート文を記述しなくても使えるようになります。
これは初心者にはうれしいですね。
おわりに
Java 25で導入された初心者向けの2つのJEPをご紹介しました。
カサレアルではJavaを初めて学ぶ方に向けて「Javaプログラミング入門」や「Javaプログラミング基礎」などのコースを開催しています。
現在、カサレアルでは、これらのコースをJava 25に対応させて、なるべく初心者の方にも優しく学べるようにカリキュラムの改訂を計画しています。
来年の新人研修までには、新しいカリキュラムで研修が行えるようにする予定です!
Javaに関するコースの詳細や開催日程に関しては以下のリンクをご覧ください。
バックエンド開発を学ぶ研修一覧
https://www.casareal.co.jp/ls/service/openseminar/search/backend