2022年3月22日(米国時間)、プログラミング言語「Java」の最新バージョンとなる「Java 18」、およびその参照実装である「OpenJDK 18」が正式リリースされた。Java 18の主な変更点としては、APIのデフォルトの文字エンコーディングとしてUTF-8が指定されたほか、JDKに簡易的なWebサーバが付属するようになったことや、swicthでパターンマッチングが使えるようになったことがある。
現在、Javaの仕様策定およびその参照実装の開発はOpenJDKプロジェクトによって行われている。OpenJDKプロジェクトでは、言語仕様やAPI、ツールセットなどに関する大きな変更はJEP(JDK Enhancement Proposal)という形で提案され、採用の判断および実装が行われる。すなわち、各バージョンで新規に採用されたJEPが、そのリリースにおける大きな変更点ということになる。
JEPJava 18では、次の9件のJEPが採用されている。
- JEP 400: UTF-8 by Default
- JEP 408: Simple Web Server
- JEP 413: Code Snippets in Java API Documentation
- JEP 416: Reimplement Core Reflection with Method Handles
- JEP 417: Vector API (Third Incubator)
- JEP 418: Internet-Address Resolution SPI
- JEP 419: Foreign Function & Memory API (Second Incubator)
- JEP 420: Pattern Matching for switch (Second Preview)
- JEP 421: Deprecate Finalization for Removal
開発者にとって最も影響が大きな変更はJEP 400だろう。これまでJavaではJVMの起動時に使用されるエンコーディングが決定され、デフォルトではOSが使用するエンコーディングが使用されるようになっていた。その結果、APIをビルドしたOSと実際に実行するOSが異なる場合に、文字化けが発生する可能性があるという問題を抱えていた。
Java 18からはAPIのエンコーディングがデフォルトでUTF-8に設定されるため、そのような文字化けの問題は発生しなくなる。これまで通りOSごとに違う設定にしたい場合は、環境変数による明示的な指定が必要になる。
JEP 408は静的なHTMLを扱うための簡易的なWebサーバがJDKに付属するようになったというもので、別途Webサーバを用意しなくてもWebページの表示の確認などを行うことができる。この簡易Webサーバは、コマンドラインから jwebserver コマンドで起動できる。
言語機能の変更としてはJEP 420がある。これはswitchにおいて型および変数によるパターンマッチングが利用できるようになるというもの。ただし、JEP 420は"Second Preview(2番目のプレビュー)"という段階であり、有効にするには実行時のオプション指定が必要。このまま問題が生じなければJava 19で正式採用される見込みとなっている。なお、現在OpenJDKプロジェクトではswitchに対するパターンマッチングのサポートを段階的に進めており、Java 19ではrecordに対するパターンマッチングがプレビューとして追加される予定となっている。
APIにおける大きな変更としてはJEP 417とJEP 419を挙げることができる。JEP 417はベクトル演算に関するパフォーマンスの向上を行うもので、具体的にはAVX命令のようなCPUの拡張命令セットを扱えるAPIを提供する。JEP 419はJavaプログラムからJVMの外部へのメモリアクセスやネイティブライブラリの呼び出しを行えるAPIを提供するというもの。
ネイティブライブラリの呼び出しをサポートするのがForeign Function APIで、ヒープ外のメモリへのアクセスをサポートするのがAPIがForeign Memory APIになる。従来のJNI(Java Native Interface)の代替として提供されるものと考えてよいだろう。ただし、いずれも"Incubator(実験的な位置付け)"とされているので、有効にするには実行時のオプション指定が必要となる。
OpenJDK 18のバイナリはプロジェクト公式サイトの次のページからダウンロードすることができる。
また、OracleやAzulをはじめとする各ベンダーからも、OpenJDKをベースとした各種ディストリビューションが提供される。
なお、Java 18のサポート期間(アップデートが提供される期間)は「Java 19がリリースされるまで」となっている。Java 19は2022年9月にリリースされる予定のため、Java 18のサポート期間は6カ月ということになる。これはOpenJDKが採用している「6ヶ月毎にメジャーアップデートを提供する」というリリースサイクルに基づくもの。2021年9月にリリースされたJava 17についてはLTS(Long Term Support)版という位置付けになっているため、2024年までの3年間はサポートが提供される。
したがって、一定期間同じバージョンを使いたいというケースではJava 17を継続して利用することが推奨される。現時点の計画では、次のLTS版はJava 23で、2024年9月にリリースされる予定となっている。