Value Class
例) record Point(int x, int y) {}
Point[]
Point
x
y
Point
x
y
Point
x
y
Heap
Point[]
x
y
x
y
x
y
Heap
value record Point(int x, int y) {}
Value Class 化
ヒープ平坦化
参照をたどる必要なし
オブジェクトヘッダーなし
キャッシュミス低減
Slide 6
Slide 6 text
Value Class と Null 非許容型
Value Class によるヒープ平坦化
null があると余分なフラグやチェックが必要
最適化の効率が薄れる
Null 非許容型の導入へ
Slide 7
Slide 7 text
Null 非許容型 / Null 許容型
JEP Draft: Null-Restricted Value Class Types
JEP Draft: Null-Restricted and Nullable Types
https://openjdk.org/jeps/8316779
https://openjdk.org/jeps/8303099
String! Null 非許容型 (Null-Restricted Type)
String? Null 許容型 (Nullable Type)
ワイドニング変換
オブジェクト初期化順序の変更
配列初期化構文
ジェネリクス型パラメータへの適用 et al.
Slide 8
Slide 8 text
オブジェクト初期化順序の変更
class Foo { ... }
class Bar extends Foo {
Baz baz;
Bar(Baz baz) {
super();
this.baz = baz;
}
}
スーパークラスのコンストラクタは
常にコンストラクタの先頭でコール
このためフィールドが未初期化状態にある
class Foo { ... }
class Bar extends Foo {
Baz baz;
Bar(Baz baz) {
this.baz = baz;
super();
}
}
スーパークラスのコンストラクタを
フィールド初期化後にコール可能
Slide 9
Slide 9 text
Conclusion
軽量不変オブジェクトへの流れ
JVM 効率化としての Value Class と Null 非許容
Value Class でなくても Null 非許容は使用可能
決まっていないことが多いが、 期待して待ちましょう