この記事について
2021/9/14 にリリースされた JDK17 の新機能をざっくりまとめます.1 情報源は基本的にOpenJDKのサイトです.
特に筆者が詳しくない分野については雑に要約してあります.それぞれの詳細は JEP の原文や他の記事などを参照してください.
JEP 306: 常に厳密な浮動小数点演算の復活2
strictfp
指定時と通常時の差を無くし,浮動小数点演算が常に厳密になりました.ほとんどのユーザーには大して影響がないと思われます.
現代のプロセッサでは厳密・非厳密に分けるメリットが薄れたということのようです. strictfp
の使用は無意味になったので,警告が出るようになりました.
警告:[strictfp] as of release 17, all floating-point expressions are evaluated strictly and 'strictfp' is not required
JEP 356: 疑似乱数生成器の強化
乱数生成器を交換可能な形で使えるようになりました.
これまで乱数生成を行うクラスが複数3あったのが,新しい java.util.random.RandomGenerator
インターフェースで統一的に扱えるようになりました.ファクトリクラスも追加されました.
JEP 382: 新しい macOS の描画パイプライン
Apple Metal API を使ったJava 2D 内部パイプラインが実装されました.
これまでは OpenGL API を使った実装のみでした.
JEP 391: macOS/AArch64 port
Appleの独自プロセッサに対応しました.
JEP 398: アプレットAPIを削除予定に指定
Java9 から非推奨になっていた Applet API が,さらに forRemoval=true
になりました.
JEP 403: JDK内部の強いカプセル化
sun.misc.Unsafe
のような重要な内部APIを除く,
JDKの内部要素のカプセル化が強化されました.
今回の変更では,--illegal-access
コマンドラインオプションによる制限緩和ができなくなりました.
JEP 407: RMI Activation の削除
RMI のうち,Java15 から forRemoval=true
な非推奨になっていた RMI Activation が削除されました.
JEP 409: Sealedクラス
継承を制限する sealed
クラスが正式に追加されました.
別の解説記事を書いたので,良ければご覧ください.
JEP 410: 実験的なAOT・JITコンパイラを削除
AOT&JITコンパイラは追加以降あまり使われておらず,メンテナスコストがかかるので削除されました.
コンパイラ作成に必要なインターフェースは維持されます.
Graalコンパイラを使いたければGraalVMが使える,とのことです.
JEP 411: Security Manager を削除予定に指定
Security Manager が forRemoval=true
の非推奨になりました.
アプレットの削除に伴い必要性が薄れたこと,現在知られている多くのリスクに Security Manager では十分対処できないこと,適切に使うのが難しくあまり利用されていないこと,Security Manager の存在により標準クラスライブラリのテストコストが大きく増大していることなどが理由です.
System.exit
の禁止など,代替手段については検討中のようです.
JEP 415: コンテキスト固有のデシリアライズフィルタ
Java9から導入されていたシリアライズ復元時のフィルタと異なり,デシリアライズ操作ごとにフィルターを設定しやすくなったようです.
ここからは正式実装ではなく試験的な機能です.
JEP 406: switch
パターンマッチング (Preview)
case でのパターン指定や case null
の追加等が予定されています.
JEP 412: Foreign Function & Memory API (Incubator)
JNIを使わずに,Javaランタイム外部のコード・データとの相互運用を行うAPIの導入が予定されています.
以前からIncubatorだった Foreign-Memory Access API と Foreign Linker API を一つのJEPにまとめたようです.
JEP 414: Vector API (Second Incubator)
実行時に適切にコンパイルされるようベクトル演算を表現するAPIの導入が予定されています.