Open1

Java22の新機能

やましたやました

JEPの機能のフェーズ

試験フェーズが用意されている。
Javaは半年に一回リリースされる。

フェーズ

  • incubator
    • 試験的に追加
  • Preview
    • Javaの文法・構文に関する試験的機能
  • Experimental
    • JavaVMに関する試験的機能
  • Standard
    • 標準仕様

JDK22

Region Pinning For G1

https://openjdk.org/jeps/423
JNIを使うことでJavaからCを呼ぶことが出来る。
しかし、JNIはGCがロック(無効化)されるためGCが行われずヒープ利用効率が悪くなる。
そこで、今回のアップデートではG1GCで使われているRegionのみPinningすることで他の領域でGCが行えるようにする。
他のGCの対応:パラレルGCはregionという概念がないので対応できない。

Statements before super

https://openjdk.org/jeps/447
親クラスのコンストラクタ呼び出し前にthisを使わない処理がかけるようになった。
初期化の流れとしては、親クラスの初期化を待って子クラスの初期化が行われる。
子クラスのフィールドは親クラスの初期化が行われるまでアクセスできないのでthisを使う処理は行えない。
使用例としては、コンストラクタで値を検証したいとき検証してからsuperが呼べる。

Unnamed Variables & Patterns

https://openjdk.org/jeps/456
Java9で利用禁止になっていた不要な変数やPatternを_でかけるようにした。
Goっぽい。

Implicity Declared Classes and Instance Main Methods

https://openjdk.org/jeps/463
クラス、パッケージ、モジュールといった概念はなしでただ実行できるようにした。
JDK21では無名クラスだったがホストにより選択された名前クラスに変更した。
void main() でもコンパイルは通る。

Foreign Function & Memory API

https://openjdk.org/jeps/454
既存APIの欠点であったヒープ外メモリを直接扱うAPIを提供。

Vector API

https://openjdk.org/jeps/460
複数データに対して同じ操作を同時に実行することを可能にして演算をサポートする。
ベクトル演算を実行するAPI。
今回のアップデートでパフォーマンスが上がった。

Class-File API

https://openjdk.org/jeps/457
ASM と呼ばれるバイトコード操作、解析フレームワークがJDK内部にある。
クラスファイルフォーマットにASMは強く依存するので互換性対応が難しい。
内部のAPIでもASMも最新のものには対応できていない。
そこで、クラスファイルAPIを提供することでJDK側が互換性を担保する。
このAPIを使うことでJavaのコードでクラスファイルが動的に作れる。

Launch Multi File Source

https://openjdk.org/jeps/458
複数javaファイルをまとめて、コンパイル操作抜きで実行できるようにした。

String Templates

https://openjdk.org/jeps/459
文字列連結が簡単になった。

. We here propose a second preview in order to gain additional experience and feedback. Except for a technical change in the types of template expressions, there are no changes relative to the first preview.

フィードバックを得るために second preview になっており、21から変更点はない。
▽参考
https://speakerdeck.com/skrb/string-templateniyoruwen-zi-lie-bu-jian

Structured Concurrency

https://openjdk.org/jeps/462
並列処理を楽にしたいのがモチベーション。
コードブロックをサブタスクに分けて同時に実行できるようにして最後は同じコードブロックに戻ってくるようになった。
ShutdownOnFailure を使えば実行中のスレッドのいずれかか失敗すれば全体の処理を終了とかできる。
JavaScriptのPromiseっぽい。

Scoped Value

https://openjdk.org/jeps/464
ThreadLocal変数はいつでも変更可能だから、コードの流れがスパゲッティコードになる。
その結果どのコンポーネントがどの順序で状態を更新しているか不明瞭。
そこで、より限定されたイミュータブルな値の受け渡しをサポートする機能。

Stream Gatherers

https://openjdk.org/jeps/461
これまで用意されたものしか使えなかったStream処理の中間操作(map, filterなど)でユーザー定義の処理をサポートする。

23にむけて出ているJEP

Primitive Type in Patterns, Instanceof, and switch

https://openjdk.org/jeps/455
パターンコンテキストでプリミティブ型を使えるようにする。