Oracleは、Javaプログラミング言語と仮想マシンのバージョン18をリリースした。この最終機能セットの9つのJEPは次のとおりである。
- JEP 400: UTF-8(デフォルト)
- JEP 408: Simple Web Server
- JEP 413: Java APIドキュメントにコードスニペット
- JEP 416: メソッドハンドルを使ったCore Reflectionの再実装
- JEP 417: Vector API(第3インキュベータ)
- JEP 418: インターネットアドレス解決SPI
- JEP 419: 外部関数・メモリAPI(第2インキュベータ)
- JEP 420: switchのパターンマッチング(第2プレビュー)
- JEP 421: 削除に向けたファイナライズの非推奨
Java 18の機能サイクルでは、以前のリリースよりも機能がわずかに少なくなっている。Java17は14の機能、Java16は17の機能、Java15は14の機能、Java14は16の機能である。
このリリースには、Project Amber、Project Loom、Project Panamaに向けて継続的に貢献するJEPと、便利な新しいツールがいくつか含まれている。この記事では、新機能をいくつか見ていく。
Project Panama
JEP 417とJEP 419はProject Panamaの支援を受けている。Project Panamaは、JVMと明確に定義された「外部」との間の相互運用性を改善し、強化するように設計されたプロジェクトだ。「外部」とは、つまり、Java以外のAPIであり、一般的にCライブラリ内で使用されるインターフェイスが含まれる場合が多い。
パフォーマンスの向上に加えて、JEP 417 Vector API(第3インキュベータ)には、以前の2ラウンドのインキュベーションからのフィードバックに応えて強化されている。その2ラウンドは、JEP 414 Vector API(第2インキュベータ)とJEP 338 Vector API(インキュベータ)である。JEP 338はJDK 16にインキュベータモジュールとして統合され、JEP 414はJDK 17を対象とした最終JEPの1つとして定義されていた。
JEP 419 外部関数・メモリAPI(第2インキュベータ)は、JDK 17で提供された最初のインキュベータJEP412 外部関数・メモリAPI(インキュベータ)から進化している。Javaコミュニティのフィードバックを基に改善されている。この第2インキュベータの変更点は次のとおりである。メモリアクセス変数ハンドルで、boolean
やMemoryAddress
インターフェイスなど、より多くのキャリアをサポートする。MemoryAddress
インターフェースとMemorySegment
インターフェース向けのより一般的なデリファレンス(間接参照)APIを提供する。外部メソッド呼び出しハンドルを取得するためのよりシンプルなAPI(MemoryType
列挙型を渡す必要がない)を提供する。Java配列をメモリセグメントとの間でコピーするための新たなAPIを提供する。
Project Loom
JEP 418はProject Loomの支援を受けている。Project Loomは、Java VM機能とAPIを探索、インキュベート、提供することを目的として設計されたプロジェクトである。このJava VM機能とAPIは、使いやすく、高スループットで軽量の同時実行性があり、新しいプログラミングモデルをサポートすることを目的として構築されるものである。これは、仮想スレッド、Delimited Continuation(実行を待つプログラムの区切り)、末尾呼び出しを通して実行される。
JEP 418 インターネットアドレス解決SPIは、ホスト名・アドレスの解決のためのサービスプロバイダーインターフェイスを定義している。これにより、java.net.InetAddress
で、デフォルトの組み込みOpenJDKリゾルバ以外のリゾルバを利用できる。
Project Amber
JEP 420はProject Amberの支援を受けている。これは、生産性を向上させるために、より小さなJava言語機能を調査し、インキュベートすることを目的に設計されたプロジェクトである。
JEP 420 switchのパターンマッチング(第2プレビュー)により、ターゲットswitch
式を、それぞれが特定のアクションを持つ複数のパターンに対してテストできるようになる。そのため、複雑なデータ指向のクエリを簡潔で安全に表現できる。これは、JDK 17で提供されているJEP406 switchのパターンマッチング(プレビュー)に続く第2プレビューである。機能強化としては、固定値のcase
ラベルが、同じタイプの条件パターンに先行することを強制するドミナンスチェックが改善された。また、switchブロックの徹底チェックは、Sealed階層によって、より正確に行われるようになった。
Java Tools
JEP 413 Java APIドキュメントにコードスニペットでは、Oracleの標準Docletに@snippet
タグが導入されている。Oracleの標準Docletは、デフォルトでHTML形式の出力を生成する有名なJava APIドキュメントユーティリティである。その目的は、APIドキュメントにサンプルソースコードを簡単に含められるようにすることである。次の2つの例が示すように、コードスニペットはインラインか外出しとなる。
このインラインの例では、ソースコードが@snippet
タグで始まるコメントに追加され、中括弧で囲まれている。
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet :
* if (v.isPresent()) {
* System.out.println("v: " + v.get());
* }
* }
*/
この外出しの例では、既存のソースファイルShowOptional.java
に@start
タグと@end
タグが含まれている。定義されたリージョン、つまりregion="example"
は、コメントとソースファイルで参照される。
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet file="ShowOptional.java" region="example"}
*/
public class ShowOptional {
void show(Optional<String> v) {
// @start region="example"
if (v.isPresent()) {
System.out.println("v: " + v.get());
}
// @end
}
}
JEP408 Simple Web Serverでは、静的ファイルのみを提供する最小限のHTTPコマンドラインWebサーバが提供される。このユーティリティは、特に教育環境でのプロトタイピング、アドホックコーディング、テストで役立つことを目的として設計されている。サーバは次のように起動できる。
java -m jdk.httpserver [-b bind address] [-p port] [-d directory] [-h to show help message] [-o none|default|verbose]
Java 19
現在、Java 19にインキュベーションとしてTargetedあるいはIntegratedとなっているJEPは1つだけである。
- JEP 422: Linux/RISC-Vポート
Java 19の正式なリリース日はまだ発表されていないが、6か月のリリースサイクルに従って2022年9月中旬にリリースされることが予想される。開発者は、2022年6月中旬に機能がフリーズすると予想できる。
Java 18は、Oracleからダウンロードできるようになっており、他のベンダーのバイナリが数日中に利用可能になる見込みである。