仕事やってたら普通に参加遅れた。
オンラインセミナーもこの在宅環境下で慣れてきた感じ。
◆マークはLTS以降、見かけることになりそうだなと思ったもの。
■Java16
(LTSは現行11 → 次回17)
Java16で組み込まれるJEPは17個
更新5個。内、3個が正式化
用語:
JEP(JDK Enhancement Proposal) 機能改善
CSR(Compatibility & Specification Reviews)
(非互換性を伴う変更のレビュー)
リリースノートはこの辺の用語を気にしたほうが良い。
試用機能
試用版を提供することでフィードバックを得やすくする。
言語機能:Preview
API:Incubator
試験的に追加されたライブラリー(モジュール)
jdk.incubator.~パッケージ名で実装。後に正式なパッケージ名に変更される。
JVM機能:Experimental
と各々呼ぶ。
明示はしてないけどPreviewは2回、3回目に正式化される慣例。
(今回previewいれると17に間に合わないのでPreviewはなし。)
■言語仕様変更
・Pattern Matching for instanceof
instanceofでパターンマッチング
15以前必ず成り立たないものはコンパイルエラー。
16以降は必ず成り立つものもコンパイルエラー。
if(str instanceof Object o){}とか。
◆Records
・イミュータブルな型。暗黙的にfinal。Lombokの@Value相当。
・要素、コンポーネント名と同名のアクセサ、getterにはならない。
・自前で書くなら必ず全内部フィールドの初期化が必要。
→カノニカル(正規)コンストラクタと呼ぶ。
・必ず書かないといけないなら省略できる
→コンパクトコンストラクタ
(QA)実装も自動生成?
→クラスファイルに実装はかかれない。(生成されるclassに実装はない。)
invokedynamic. JVMで実装時に実行される。
今後はtoString()とかも最適な内部実装になる。hashcode()も。
JVMのバージョンごとに最適な実装を提供をする。
・Sealed Classes(2nd preview)
・親クラス定義時に継承できる子クラスを限定できる
今の所つかい道なさそう。
・non-sealed→ハイフン付きキーワード(予約語)が登場。今後も増えるかも。
・Warnings for Value-Based Classes
primitive classを活用してインライン表現が可能なようにプログラミングモデルを強化
(値クラス JDK8からあるValue-Based classもこれの対象にしたい)
非互換性バリバリの変更。
ValueBasedアノテーションが追加される
JVM側も変更。
■API
・Vector API(Incubator)
SIMD演算をJavaから使える
Intel ハイエンドならAVX512命令サポート。これだと double(64bit)*8 が同時に演算できる。
レイトレーシングを題材に実際に使ったら遅くなった。
JITが効かんから?
・Foreign memory Access API(3rd Incubator)
大量データを処理するためにGCで管理されないメモリを確保するAPI
Undafeを使わず標準APIを提供する。
◆Stream.toList()
→collector(Collectors.toUnmodifiableList())と書かなくて良くなった。今まではcollector経由。
変更不可リストなのでCollectors.toList()と置き換えられない。
・Unix-Domain Socket(AF_UNIX) Channels
ソケットプログラミングをもっと簡単に。
・Foreign Linker API (Project Panama)
JNIをより便利に。ネイティブ実装をもっと楽に呼びたい。
今はincubatorパッケージにある。実行時にモジュール追加が必要。
■OpenJDK
・Alpine Linuxで最小Docker imageを作る話
・musl、busybox、apk→コンパクトなLinux
・SpringBootで簡単なコントローラー付ける→初回961MB。コレを減らしていく。
・jlinkで最適化、jdepsで必要なモジュールを確認
・mercurial → git, GitHubに移行。
■JVM変更
・ZGC
スレッドスタック処理をsafepointから並行フェーズに移行することでZGCのSTW(Stop The World)を更に減少
・Elasctic Metaspace
Metaspace領域のフラグメンテーションやメモリフットプリントを改善
・Storongly Encapsulate JDK Internal by Default
sun.misc.Unsafeをふくむ重要なAPIを除くJDK内部実装へのアクセスを原則不可
■ツール変更
・Packaging Tool
・JDK14で入ったjpackageが標準化
jpackageでインストーラーを作ってユーザに提供する流れが一般的になるかもしれない。
■その他所感
・サンプルコード、最近はvarだからけなんだなぁ。
TypeScript同様、右辺が明確なものはもう型を意識しないのかも。
(実際コーディングもエディタ補完で右辺から書いて左辺みたいな感じになってるし。)
・recordのObject class由来のメソッドがJVMで実行される話が一番面白いと思った。
Effective Javaで長々と解説されていたアレらをイイ感じにJVMが片付けてくれるなら願ってもないことだ。