Java 25リリース ――初心者向け機能や起動時間短縮など

2025年9月16日(米国時間)にLTSLong-Term Support、長期サポート)であるJava 25がリリースされました。

現在、JavaはOpenJDKにて開発が続けられています。OpenJDKでは、バージョンごとに取り入れられる機能をJEP (JDK Enhancement Proposal)としてまとめています。JEPには新機能だけでなく、既存の機能の削除などの提案も含まれています。

Java 25でのJEPは18。その中には正式な機能となったJEP(Standard JEP)が12、お試し機能であるPreviewやExperimentalが6となっています。LTSではないバージョンに比べると、Standard JEPの割合が多くなっています。

Standard JEPを以下に示しました。

  • 503:Remove the 32-bit x86 Port
  • 506:Scoped Values
  • 510:Key Derivation Function API
  • 511:Module Import Declarations
  • 512:Compact Source Files and Instance Main Methods
  • 513:Flexible Constructor Bodies
  • 514:Ahead-of-Time Command-Line Ergonomics
  • 515:Ahead-of-Time Method Profiling
  • 518:JFR Cooperative Sampling
  • 519:Compact Object Headers
  • 520:JFR Method Timing & Tracing
  • 521:Generational Shenandoah

これらのJEPを筆者なりに分類してみました。

初心者向け機能 JEP 511、JEP 512
Value Class導入に向けた機能 JEP 513、JEP 519
起動時間短縮 JEP 514、JEP 515
安全性、セキュリティ JEP 503、JEP 510
その他 JEP 506、JEP 518、JEP 520、JEP 521

また、PreviewやExperimentalであるJEPを以下に示しました。

  • 470:PEM Encodings of Cryptographic Objects(Preview)
  • 502:Stable Values(Preview)
  • 505:Structured Concurrency(Fifth Preview)
  • 507:Primitive Types in Patterns, instanceof, and switch(Third Preview)
  • 508:Vector API (Tenth Incubator)
  • 509:JFR CPU-Time Profiling(Experimental)

本記事では主にStandard JEPに関して簡単に解説を加えていきます。

Java 25の新機能

初心者向け機能

Javaは初心者にとってハードルの高い言語と言われています。

その理由の1つに、初心者が簡単なプログラムを書こうとしても、メインクラスを書かなければいけないなど、どうしても記述量が多くなってしまう点があります。また、初心者にとって呪文のような記述をしなければいけない箇所もあります。

これらを解消するのが、JEP 511:Module Import DeclarationsJEP 512:Compact Source Files and Instance Main Methodsです。

JEP 511によって、煩雑になりがちなインポート文をモジュール単位で指定することができるようになりました。JEP 512では、メインクラスを省略し、mainメソッドも簡易化するための仕様を策定しています。また、標準入出力を扱うクラスとしてjava.lang.IOクラスを導入しています。

従来、java.langパッケージのクラスなどはインポート文を記述する必要がありませんでした。JEP 511とJEP 512ではこれを拡張し、java.baseモジュールに含まれるクラスなどもインポート文を記述する必要がなくなりました。このため、使用頻度の多いjava.util.Listインタフェースなどのコレクションフレームワークもインポート文を記述せずに使用できます。

たとえば、リストの要素を標準出力に出力するプログラムは従来は次のように記述しました。

従来のリストの要素を出力する記述
    import java.util.List;

    public class Main {
      public static void main(String... args) {
        List<String> texts = List.of("Alpha", "Bravo", "Charlie");
        texts.forEach(text -> System.out.println(text));
      }
    }

このプログラムがJava 25では次のようになります。

Java 25での記述
    void main() {
      List<String> texts = List.of("Alpha", "Bravo", "Charlie");
      texts.forEach(text -> IO.println(text));
    }

インポート文やメインクラスがなくなり、またmainメソッドのアクセス修飾子なども省略できるようになりました。

JavaではSpring Frameworkなどのフレームワークを使用すること多いので、mainメソッドを記述することはあまりありません。しかし、初心者のうちはmainメソッドを記述する機会も多いので、この仕様変更はうれしいのではないでしょうか。

Value Class導入に向けた機能

Javaの型はプリミティブ型と参照型の2種類です。しかし、状態を変更できないイミュータブルな小さいデータの重要性が高まっており、Javaでもこのようなデータを表すために新たにValue Classの導入が検討されています。

Value Classはプリミティブ型と参照型の中間に相当する型ですが、Java言語仕様の大幅な変更となるため、すぐに導入するというわけにはいきません。そこで、Value Classの導入に向けた準備のための機能の導入から始まっています。

Java 25では、JEP 513:Flexible Constructor BodiesJEP 519:Compact Object Headersが導入されています。

Javaのオブジェクトをヒープに配置する場合、必ずオブジェクトヘッダーが付加されます。従来、オブジェクトヘッダーは128bitありました。これを64bitにコンパクト化するのがJEP 513です。JEP 513はValue Classとは直接関連はありませんが、大量のデータクラスを扱うためにはヒープの効率化が重要になっていました。

一方のJEP 513はオブジェクトのフィールドの初期化順序を変更するための仕様です。

従来、オブジェクトの初期化はスーパークラスから行い、当該オブジェクトの初期化は後になります。このため、オブジェクトにfinalのフィールドがあったとしても、そのフィールドの初期化前にスーパークラスからアクセスできてしまうという問題がありました。

Value Classはイミュータブルであるため、初期化していない不定の状態のフィールドにアクセスできてしまうことは問題です。

このため、オブジェクトの初期化時に、サブクラスのフィールドの初期化を先に行えるように変更したのがJEP 513です。

Value Classの導入時期はまだ決まっていませんが、小さなイミュータブルなデータを扱うためにできることから始まっているのです。

起動時間短縮

Javaのアプリケーションをサーバーレスで運用する場合、その起動時間が問題になること多くありました。この問題の対応には、GraalVMのネイティブイメージなどが利用されてきました。

OpenJDKでもこの問題に取り組むべく、2022年に始まったのがProject Leydenです。

Project Leydenでは、Java 24でJEP 483:Ahead-of-Time Class Loading & Linkingが導入されましたが、Java 25でも以下の2つのJEPが導入されます。

  • 514:Ahead-of-Time Command-Line Ergonomics
  • 515:Ahead-of-Time Method Profiling

JVMは起動時にクラスをロードし、クラスが互いのAPIを使用できるようにリンクします。そこで、リンクが終了した時点の状態をAOTキャッシュに保存して起き、次回の起動時に利用できるようにしたのがJava 24のJEP 483です。

JEP 483では、AOTキャッシュを作成するためのトレーニング実行と、AOTキャッシュの作成の2段階が必要でした。これを1度の実行でキャッシュ作成までできるようにしたのがJEP 514です。

また、OpenJDKが提供しているHotSpot VMは実行中にアプリケーションのプロファイリングを行い、その情報を基にJITコンパイルなどの最適化を行います。このプロファイリングをAOTキャッシュ作成時に行い、プロファイリング情報もAOTキャッシュに保存できるようにしたのがJEP 515です。

これにより、JVMの起動時にJITコンパイルを行うことが可能になり、ピークパフォーマンスに至るまでの時間を短縮することができます。

安全性⁠セキュリティ

安全性やセキュリティは常に改善していく項目です。

32bit版のWindows 10のサポートが2025年10月に終了することから、JavaでもJava 24で32bit版のWindowsの開発が終了しています。これに引き続き、Java 25ではJEP 503:Remove the 32-bit x86 Portによりx86のポーティングが終了します。

セキュリティに関しては、JEP 510:Key Derivation Function APIにより、暗号理論における鍵導出関数を扱うためのAPIが追加されています。

その他

その他の機能も簡単に触れておきます。

JEP 506:Scoped Valuesでは、いろいろと問題のあったThreadLocalクラスを置き換え、並列処理においてもオブジェクト間で安全にデータを共有するため、java.lang.ScopedValueクラスを導入しています。

JEP 518:JFR Cooperative Sampling520:JFR Method Timing & Tracingは、どちらもJDK Flight Recorder (JFR)の機能拡張のためのJEPです。

JFRはアプリケーションの監視やプロファイリングを行うためのフレームワークですが、JEP 518ではプロファイリングのための実装を改良し、安定してプロファイリングを行うようにしています。また、JEP 520では、メソッドの呼び出しの時間とスタックトレースを記録できるように機能拡張を行っています。

最後の、JEP 521:Generational ShenandoahはGCアルゴリズムの1つであるShenandoah GCを世代別CGに変更するためのJEPです。

Preview JEP

最後にPreview JEPの中から、JEP 502とJEP 507の2つを紹介しておきます。

クラスのフィールドの初期化に時間がかかる場合、そのフィールドを実際に使う時まで初期化を遅らせるテクニックがあります。しかし、フィールドがfinalの場合にはこれが使えません。そこで、JEP 502:Stable Valuesでは、java.lang.StableValueクラスを導入して、finalのフィールドであっても安全に遅延初期化を行えるように提案しています。

また、JEP 507:Primitive Types in Patterns, instanceof, and switchは、switch式のパターンマッチングにプリミティブ型を使用できるようにする提案です。この提案はJava 24の時点で2回目のプレビューだったため、Java 25で正式に導入されることが期待されていたのですが、残念ながら見送りになってしまいました。

おわりに

Java 25はLTSということもあり、多くの機能が導入されています。

2025年はJavaが誕生して30年目の年ですが、まだまだ活発に開発が続けられています。大きなトレンドとして、イミュータブルな小さなデータを扱うことが重要になっており、それに関する機能が取り入れ始められています。Javaは互換性を重視する言語であり、互換性を保ちつつ、新しい機能を取り入れるために多くのリソースがかけられています。

また、初心者の学習のハードルを下げることや、起動時間の短縮も重要な課題です。

今後もこれらの課題に対して、Javaにどのような機能が取り入れられていくか目が離せません。

おすすめ記事

記事・ニュース一覧