2024-03-27に開催されたJJUGナイトセミナー「 Java 22リリース記念イベント」に参加したメモ。
【オフライン】JJUGナイトセミナー「Java 22 リリース記念イベント」3/27(水) 開催多分資料と合わせて見るかJEPと付き合わせないと自分でも思い出せなくなる気がするけど、まだ資料は公開されていないかな? 時期に公開されると思うのでそのときにリンク追記します。
※2024/04/01 20:39追記: 資料が公開されました
Head toward Java 22 and Java 23 - Speaker Deckセッション登壇された久保田( @sugarlife)さん、運営スタッフの皆さん、ありがとうございました。
JEPs in JDK 22#
JEP 423: REgion Pinning for G1
JNIを使っているとGCが無効化される(GC Locker)
→critical objectがいるRegionをPinningする(Evacuationさせない)ことでGCを待たせることなく処理できるように
※Pinning自体は既存の仕組み
OOME発生可能性の緩和とパフォーマンス改善(全体のstall回避)の効果
Shenandoahは(おそらく当初から)対応済み、ZGCはこれから。JEP 447: Statements before super(…) (preview)
親クラスのコンストラクタ(super()
)呼び出し前に処理がかける
例: コンストラクタ引数の値を検証してから呼びたい (従来: コンストラクタに渡してから検証するしか無かった。あるいは、検証メソッドをstaticで書く必要があった)
例: 値の準備(コンストラクタ引数で受け取った値を加工して親コンストラクタ・別のコンストラクタに渡す)
例: 親コンストラクタの引数を共有したい(ローカル変数を経由できる)
制約: コンストラクト前のインスタンスはアクセス不可(コンストラクタを呼ぶ前にフィールド・メソッドを触る、等はエラー)
エラーははっきりとした表現
例:cannot reference this before supertype constructor has been called
JEP 456: Unnamed Variables & Patterns
不要な変数やパターンを_
(Java9で禁止された)でかけるようにし、不要なことを明確にする等
JDK 21から内容の変更なしJEP 4463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
“おまじない"の削減void main()
orvoid main(String[] args)
であれば、アクセス修飾子等は何でも良い
クラス宣言も不要JEP 454: Foreign Function & Memory API
Java -> Native: downcall
Native -> Java: upcallJEP 460: Vector API (Seventh Incubator)
SIMD演算(ベクトル演算)のサポートJEP 457: Class-File API (Preview) ASMをJDK内部でも使っており、クラスファイルフォーマットが変わるとASMの対応に時間がかかる
→クラスファイルAPIを提供することで、JDK側で互換性を担保したい
フィールド、メソッド、属性、バイトコード命令などのクラスファイルの実体を不変のオブジェクトとして扱うAPI(java.lang.classfile
)を提供
(感想)ASMと同じ書き方のはずだが、こちらのほうが読みやすく見える気がする
(感想 with lambda)良きJEP 459: Launch Multi-File Source-Code Programs
ソースコードから直接実行する Source-file mode が複数ファイルに対応JEP 459: String Templates (Second Preview)
Advanced usage: https://github.com/bitterfox/json-string-templateJEP 462: Structured Concurrency (Second Preview)
内容としてはJDK21から変更なしJEP 464: Scoped Values (Second Preview)
JDK 21から変更なし
ThreadLocalよりも扱いやすく
Structured Concurrencyとの組み合わせでも有用(ThreadLocalだと子スレッドにコピーされてしみ合う)JEP 461: Stream Gatherers (Preview)
中間操作のユーザ定義をサポートするstream.gather(..).gather(..).gather(..).collect(..)
java.util.stream.Collector
に対するjava.util.stream.Gatherer
built-in gatherersもある
fold: Stream#reduceと違って順序保証があり、BiFunctionを受け取るので入力と出力の方が違っても良い
scan: インクリメンタルな累積
mapConcurrent: mapをVirtual Threadを使ってconcurrentに
windowFixed: 順番に詰める
windowSliding: 一つずつずらしながら末尾まで詰める
Gathererで自前実装する: Initializer, Integrator, Combiner(sequencialでない場合のみ), Finisher
Integrator: downstream: 出力のイメージでいいかな
FInisher: 最後に余ったものをdownstreamに突っ込んで終わる
JDK 23#
- JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)