record Point(double x, double y) {}
Point points[] = {new Ponit(0.0, 0.0), .....};
points
[0]
[1]
[2]
[3]
Point
x
y
0.0
0.0
Point
x
y
1.0
2.0
Point
x
y
3.0
2.0
Point
x
y
4.0
4.0
Slide 7
Slide 7 text
CPU のメモリ構成
Register
Main Memory
L1 Cache
L2 Cache
L3 Cache
容量
Small
Large
10 byte
2
10 3
10 6
10 7
10 ~
9
速度
Fast
Slow
1 cycle
4
10-15
20-50
100 ~
Slide 8
Slide 8 text
CPU のメモリ構成
データがキャッシュにない キャッシュミス
キャッシュへのロードはチャンクで行われる
まとめて使われるデータは近くに配置する
Slide 9
Slide 9 text
for (var p: points) {
// p Λͬͨॲཧ
}
points
[0]
[1]
[2]
[3]
Point
x
y
0.0
0.0
Point
x
y
4.0
4.0
Point
x
y
1.0
2.0
Point
x
y
3.0
2.0
キャッシュミス多発
Value Class
Identity がないクラス
Immutable
フィールドは暗黙的に nal
== による比較はフィールドの等価性
equals() と同じ
Identity による操作は不可
Monitor Lock, Weak Reference など
Slide 16
Slide 16 text
Value Class の書き方
value class Foo { ... }
value record Bar( ... ) { }
継承も可能
Value Class になりうる標準クラス
Number (Integer, Double...)
java.time など
Early Access 公開中
https://jdk.java.net/valhalla/
Slide 17
Slide 17 text
Value Class の最適化 - 平坦化
Point points[]
Point[]
[0].x 0.0
[0].y 0.0
[1].x 1.0
[1].y 2.0
[2].x 3.0
[2].y 2.0
[3].x 4.0
[3].y 4.0
ArrayList
elementData
ArrayList list
Object[]
[0].x 0.0
[0].y 0.0
[1].x 1.0
[1].y 2.0
[2].x 3.0
[2].y 2.0
[3].x 4.0
[3].y 4.0
record Rect(Point tl,
Point br) {}
Rect
tl.x 0.0
tl.y 0.0
br.x 3.0
br.y 2.0
Slide 18
Slide 18 text
Java Stack
calcTotal
Operand Stack Local Var
this
scores
adder
s
Adder
sum
Slide 19
Slide 19 text
Java Stack
calcTotal
Operand Stack Local Var
this
scores
adder
s
.sum
Slide 20
Slide 20 text
最適化の大敵 null
Null-Restricted
Nullable Type の導入
JEP draft: Null-Restricted and Nullable Types
https://openjdk.org/jeps/8303099
JEP draft: Null-Restricted Value Class Types
https://openjdk.org/jeps/8316779
Slide 21
Slide 21 text
Null-Restriced/Nullable Type
String! text = ...
String? text = ...
Null-Restriced
Nullable
配列の初期化
Slide 22
Slide 22 text
Null-Restriced/Nullable Type
String! text = ...
String? text = ...
Null-Restriced
Nullable
配列の初期化
Slide 23
Slide 23 text
Puzzle: Do Lion Meow?
選択肢
例外
Slide 24
Slide 24 text
Puzzle: Do Lion Meow?
選択肢
例外
Slide 25
Slide 25 text
Puzzle: Do Lion Meow?
選択肢
例外
nal 変数でも
初期化前の状態に
アクセスできてしまう!
Slide 26
Slide 26 text
JEP 492: Flexible Constructor Bodies
super() の前にフィールド初期化が可能
Slide 27
Slide 27 text
No content
Slide 28
Slide 28 text
Value Class のまとめ
Identity がなく、 イミュータブルなクラス
宣言時に value を付加するだけ
平坦化などの最適化のために導入
サイズが小さく
フィールドが適切なデフォルト値 or 初期化されている場合のみ
Value Class にすべきデータ
サイズが小さく、 イミュータブルなデータ
ビジネスロジックで登場する値オブジェクト
Record Class は、 ほとんどの場合 Value Class にすることが可能
Slide 29
Slide 29 text
Conclusion
Value Class: Code like a Class, Works like an int
平坦化などの最適化
イミュータブルなデータであれば適用可能
Null-Restriced/Nullable Type の導入
インスタンス初期化ロジックが変更
いつごろ導入されるかは???
Slide 30
Slide 30 text
Reference
JEP 401: Value Classes and Objects
https://openjdk.org/jeps/401
JEP draft: Null-Restricted and Nullable Types
https://openjdk.org/jeps/8303099
JEP draft: Null-Restricted Value Class Types
https://openjdk.org/jeps/8316779
JEP 492: Flexible Constructor Bodies
https://openjdk.org/jeps/492
JEP 218: Generics over Primitive Types
https://openjdk.org/jeps/218
Valhalla - Where Are We? (JVMLS 2024)
https://youtu.be/IF9l8fYfSnI?si=Ghx5r9SHuxQahu-9
Valhalla - Where Are We? (Devoxx BE 2024)
https://youtu.be/eL1yyTwu4hc?si=TS6AkZQtRnoEjBdQ
A New Model for Java Object Initialization (JVMLS 2024)
https://youtu.be/ThtrTwooKDc?si=745Bno9z1UxW263Z
Slide 31
Slide 31 text
Valhalla
で、 の
って
どうなったの?
Value Class
Java in the Box
櫻庭 祐一