JDK 17以降、初の非LTSリリースとなるJDK 18が最初のリリース候補フェーズに到達したと、OracleのJava Platform GroupのチーフエバンジェリストであるMark Reinhold氏が宣言した。2021年12月初頭にスタビライゼーションリポジトリに分岐したメインラインのソースリポジトリ(ランプダウンフェーズ1)が、JDK 18の機能セット上の定義となる。リグレッションや重大な機能的問題のようなクリティカルなバグには対処するが、Fix Requestプロセスを通じた承認が必要だ。
最終的に9件となったJEP形式の新機能は、Core Java Library、Java Tools、Java Specificationという、3つのカテゴリに分類することができる。我々は今回、これら新機能を検証した上で、そのいくつかについて、Amber、Loom、Panama、およびValhalla — いずれも最終的にはJDKに統合されることを前提として、一連のコンポーネントをインキュベートするようにデザインされたプロジェクト — という、4つのメジャーなJavaプロジェクトのどれに収まるものであるかを検討した。
新機能の中の7件はCore Java Libraryの範疇に含まれる。
- JEP 400: UTF-8 by Default (
java.nio.charsets
) - JEP 408: Simple Web Server (
java.net
) - JEP 416: Reimplement Core Reflection with Method Handles (
java.lang.reflect
) - JEP 417: Vector API (Third Incubator)
- JEP 418: Internet-Address Resolution SPI (
java.net
) - JEP 419: Foreign Function & Memory API (Second Incubator)
- JEP 421: Deprecate Finalization for Removal (
java.lang
)
これらの中でJEP 417とJEP 419の2つは、Project Panamaの実現に向けた継続的コントリビューションを提供するものだ。Project Panamaは、明確に定義された"外部" — 非Javaの、多くはCライブラリ内部で一般的に使用されるインターフェースを持つAPI — とJVMの相互運用性を改善し、強化するべく設計されたプロジェクトである。OracleのソフトウェアアーキテクトであるMaurizio Cimadamore氏をリーダとするこのプロジェクトは、2014年に発表された。2022年1月18日にアップデートされた早期アクセスビルドでは、JDK 19の未完成バージョンをベースに使用している。
JEP 418はProject Loomの実現に向けた継続的コントリビューションを提供する。このプロジェクトは、使用が容易でスループットが高く、軽量な並列プログラミングモデルを新たに構築することを目指して、Java VMの機能とAPIの調査検討、育成、提供を行うもので、達成手段として仮想スレッド、限定継続(delimited continuations)、末尾再帰( tail calls)を使用する。2018年に発表されたProject Loomのリーダは、OracleテクニカルスタッフのコンサルティングメンバであるRon Pressler氏だ。2022年2月13日にアップデートされた早期アクセスビルドは、JDK 19 早期アクセスビルドのBuild 9を使用する。
残る2つのJEPの中で、
は、第2のカテゴリであるJava Toolsに属する。このJEPは、既定でHTML形式の出力を生成するJava APIドキュメンテーションユーティリティとして有名な、OracleのStandard Docletに@snippet
タグを導入して、API資料へのソースコードサンプルの挿入を容易にするものだ。
そして最後の、
は、Java Specificationカテゴリに分類される。このJEPは、Project Amberの実現に向けた継続的コントリビューションを提供する。生産性向上を目的とした小規模なJava言語機能の調査とインキュベーションを目的とするプロジェクトである。2017年に発表されたこのプロジェクトは、OracleのJava言語アーキテクトであるBrian Goetz氏がリーダを務める。
リリーススケジュール上では、2022年3月22日がJDK 18の公式リリース日である。
JDK 19
2022年9月のGAリリースが予定されるJDK 19には、現時点ではそれを対象とするJEPは存在しない。ただし、最新のJEPドラフトやJEP候補、あるいはOracleのJava開発者アドボケートであるNicolai Parlog氏の"Inside Java Newscast #18"を参照すれば、どのJEPがJDK 19に含まれる可能性があるのかを推測することは可能である。
Project Valhallaは、高度なJVM機能とJava言語機能を調査し、インキュベートすることを目的とするプロジェクトで、値型(value type)やジェネリックシリアライゼーション、拡張volatilneなどが対象に含まれる。2014年に発表されたこのプロジェクトも、Brian Goetz氏がリーダだ。2019年8月30日にアップデートされた早期アクセスビルドは、現時点では極めて限定的なものだが、プロジェクト内のアクティビティはこの1年間で非常に活発なものになっている。
Project Valhallaの2022年の計画には、値クラス(JEP Draft 8277163 "Value Objects (Preview)")、プリミティブクラス(JEP 401 "Primitive Classes (Preview)"、およびJEP 402 "Classes for the Basic Primitives (Preview)")、ユニバーサルジェネリクス (JEP Draft 8261529 "Universal Generics (Preview)")などが挙げられている。Project Valhallaについて詳しく知るには、Goetz氏が2021年12月に公開した3部のシリーズ記事を読むとよいだろう。
- State of Valhalla, Part 1: The Road to Valhalla
- State of Valhalla, Part 2: The Language Model
- State of Valhalla, Part 3: The JVM Model
Project Amberの2022年の計画には、switchのパターン対応の完成(JDK 17で提供されたJEP 420およびJEP 406 "Pattern Matching for switch (Preview)"のフォローアップとして3番目のプレビューになると思われる)、レコードと配列(場合によっては通常のクラス)を対象としたデコンストラクション(JEP 405 "Record Patterns (Preview)")などが挙がっている。元々"Record Patterns & Array Patterns (Preview)"という名称であったJEP 405は、JEP 406に関連している。
Project Panamaの2022年の計画には、現在インキュベーション状態である外部APIのプレビューへの移行、外部API実装の改善、jextract
の今後に関する判断(対応するリポジトリを持った独立プロジェクトにすべきかどうか)、Project Valhallaに値型とプリミティブ型が実装されるまでVector APIを保持すること、などが含まれている。JEP Draft 8280173 "Vector API (Fourth Incubator)"は、Javaコミュニティからのフィードバックに基づいて、先行する3つのプロジェクト、すなわち、JDK 16で提供されたJEP 388 "Vector API (Incubator)"、JDK 17で提供されたJEP 414 "Vector API (Second Incubator)"、間もなく登場するJDK 18 GAリリースで提供予定のJEP 417 "Vector API (Third Incubator)"への同プロジェクトの組み込みを提案中である。
2022年のProject Loomの計画には、JEP Draft 8277131 "Virtual Threads (Preview)"およびJEP Draft 8277129 "Structured Concurrency (Incubator)"の完了と、JDKメインリポジトリへのこれら機能のマージ、高度に並列的なアプリケーションのデバッグを容易にする方法の検討、構造的並行性(structured concurrency)の強化などが挙げられている。JEP Draft 8263012 "Scope Locals (Incubator)"では、スコープローカル(動的にスコープされる、実質的にfinalなローカル変数)によるJava APIの拡張を提案している。これにより、軽量な形式によるスレッドインヘリタンスが可能になる。
これらや他のJEPについては、Oracleが間もなくJDK 19のターゲットにするものと期待されている。