JJUGナイトセミナー「Java 15 リリース記念イベント」に行ってきた #jjug

JJUGナイトセミナー「Java 15 リリース記念イベント」に参加しました。今回はオンライン開催。簡単に所感をまとめます。

jjug.doorkeeper.jp

所感

チャットにも書かれてましたが、リリースサイクルが変わってから少しずつ機能が追加されていくのでキャッチアップしやすくていいですね。

Sealed Classes の最終目標は「使えるパターンマッチング」とのことで、機能をうまく分割して導入しているようです。なるほど。将来、どういう機能を実現したいのかを意識しておくのは大事かも。

あと、Biased Locking とか Hidden Classes は初めて聞きました。Hidden Classes は新しい機能なのでちょっと調べてみるか。

YouTube はこちら。

youtu.be

以下、メモから抜粋。

Welcome, Java 15!

  • Azul では 13/15 が MTS
  • Java 15 の JEP は 14個
  • Nashorn ⇒ GraalJS への移行を推奨
  • Biased Locking
    • デフォルト無効化
    • デフォルトのロック実装
    • アトミックな CAS 命令が高コストではなくなった
  • Hidden Classes
  • UDP socket API を Fiber 対応
  • ZGC
  • Text Blocks
  • Shenandoah
  • (Preview) Pattern Matching for instanceof
    • 型テストパターン (type-test pattern)
    • 型が一致するときは変数にバインドされる
  • (Preview) Records
    • フィールドの名前がそのまま getter になる (フィールド変数の命名に注意)
    • immutable
    • インタフェース実装可
    • extends 不可
    • フィールドは final (リフレクション利用不可)
  • (Preview) Sealed Classes
    • 実装/継承先を同一コンパイル単位内のクラスのみに制限する?
    • パターンマッチングと組み合わせて使う
    • sealed で宣言
    • permits で拡張を許可するサブクラスを列挙する
    • 拡張許可されたサブクラスの制約☆
  • Foreign-Memory Access API
    • よくわからず...
  • Parallel/G1 GC
    • -XX:MaxRAM=16g のみ, ヒープサイズ指定なしの場合?
    • Parallel GCスループット重視
    • G1 はスループット&レイテンシ重視
    • Java 15 ではヒープのリージョンサイズ指定を変更

Recordsを中心にした新機能の紹介と今後の展望

  • Records (2nd Preview)
  • 名前付きタプル
  • record はキーワードではない
    • 型には使えないけど変数名には使える
  • Record の要素はコンポーネントと呼ぶ
  • 中括弧は省略不可
  • Canonical Constructor
  • Compact Constructor
  • コンパクトコンストラク
    • コンストラクタのパラメータは省略可
    • フィールドは初期化してはいけない
  • Pattern Matching for instanceof (2nd Preview)
    • Kotlin のスマートキャストみたいな機能
  • Sealed Classes (Preview)
  • 継承できるクラスを限定する
  • 現状では使い道なし?
    • 後発の機能と組み合わせて使う?
    • Pattern Matching for switch とか
  • sealed, final, non-sealed
    • non-sealed を付けるとそれ以下の階層は継承可
  • Sealed Classes の今後の計画☆
  • Pattern Matching for switch
    • Sealed Classes と組み合わせると default なしで書けるようになる
  • Deconstruction
    • パターンマッチングで構造を分解する
    • Optional をパターンマッチングしたい☆
    • Optional を interface にする必要がある
      • ※リフレクションで非互換性が出る
    • Some, None が Optional を実装する
      • Sealed Classes がないため final class になっている
  • 最終目標は使えるパターンマッチング☆