JEP 401 Value Objects (Preview) が OpenJDK master にマージされました
概要
JEP 401 Value Objects (Preview) および JEP 539 Strict Field Initialization が OpenJDK の master ブランチにマージされました。
プルリクエスト #31120 は、2,934 個のコミット(208,011 個の追加と 13,161 個の削除)を統合し、依存関係にある JEP 539 と共に JEP 401 の最初のプレビューを実装しました。この変更は、マージコンフリクトの解決と必要な承認を得た後、2026年7月31日に統合の準備が整いました。結果として生成されたすべてのコードは、週次タグで jdk/master と同期されている valhalla/lworld リポジトリでさらに開発される予定です。
言語の実装
Java 言語は、不変でアイデンティティを持たない型を定義する value class の宣言を許可するようになりました。
この変更は、サブレビュー JDK-8317277 (Java language implementation of value objects) に対応しています。Value class は、List<T> や Comparable<T> のようなジェネリック型の型引数として使用できます。あるコメント投稿者が指摘したように、「List<T> や Comparable<T> のようなジェネリック型は、型引数に value class を使用してインスタンス化できます。JEP 218, Generics over Primitive Types (with revisions) により、ジェネリッククラスやメソッドが value class 型によってパラメータ化されたときに、フィールド、配列、ローカル変数のレイアウトを特化できるようになります。これは素晴らしい!JVM は、より良いメモリ割り当てと最適化のために、コンパイル時に既知の値サイズを使用する方法をさらに必要としています。」なお、このプレビューには、将来のステップとして残されている JEP 218 による特化はまだ含まれていません。
JVM の実装
JVM は、従来のオブジェクトヘッダーなしで value object を割り当て、JEP 539 でプレビューされている厳格なフィールド初期化を強制するように更新されました。 この作業は、サブレビュー JDK-8317278 (JVM implementation of value objects) で追跡されています。JVM は現在、value object をインライン型として扱い、オブジェクトのアイデンティティとそれに関連するヘッダーのオーバーヘッドを排除しています。あるコメント投稿者はその影響について疑問を呈しました。「もし私がこれを正しく理解しているなら、Integer は value class になり、そのすべてのインスタンスがオブジェクトのアイデンティティを失うことになります。詳細についてはあまり知識がありませんが、当初から見て、これはかなり大胆な動きのように思えます。」別の人はデータ制限について尋ねました。「最新の状況はどうですか?まだ 63 ビットのデータと null 許容性のための 1 ビットに制限されていますか?」これらの質問は、この機能のプレビューとしての性質を反映しています。
標準ライブラリの更新
コアライブラリの調整により、String のような既存の参照型を維持しつつ、value object に対応できるようになりました。 サブレビュー JDK-8317279 (Standard library implementation of value objects) により、value 型で動作するように JDK が更新されました。コミュニティのメンバーは、残っている違いについて次のように述べています。「本当に素晴らしいですが、String がその不変性にもかかわらず、Integer のように完全に区別がつかないものになれないのは残念です。」一方で、別の人は進歩を称賛しました。「モダンな Java は最高だ。最近では、これ以外のものを使う理由が本当にわからないよ!」
JEP 539 との関係
JEP 401 は、value object のフィールドが使用前に完全に初期化されていることを保証するために、JEP 539 の厳格なフィールド初期化のプレビューに依存しています。 プルリクエストの説明には、JEP 401 が厳格なフィールド初期化に依存しているため、JEP 539 が同じコードベースに実装されたことが明記されています。この依存関係に関するさらなるコメントは、ソース資料には見られません。
コミュニティの反応
Hacker News のコメント投稿者たちは、その範囲や広範な Valhalla の取り組みとの関係について議論しながら、このマージをパフォーマンスの節目として歓迎しました。
それについて孤独を感じます。私は主に言語としての Java が大好きです。value 型の欠如は、特定の種類のパフォーマンスにおける最大の障害です。この言語の進化を本当に楽しみにしています。 – @timmg これが何をカバーし、何をカバーしていないかを理解することが重要だと思います。これは「Valhalla の最初の部分に過ぎません」。例えば、https://www.jvm-weekly.com/p/project-valhalla-explained-how-... の優れた要約を参照してください。 – @mormegil 言語を前進させるような変更を導入する際、Java のリーダーたちがどれほどの思考と労力を費やしているかにいつも驚かされます。それでいて、可能な限り後方互換性を維持しています。 – @ludovicianul モダンな Java は最高だ。最近では、これ以外のものを使う理由が本当にわからないよ! – @exabrial ついにここが進展しているのを見られて本当に嬉しい。value 型の欠如は、数十年にわたり Java における最大のパフォーマンス上の落とし穴の一つでした。 – @swiftcoder 両方の言語が依然として新機能を導入している一方で、Java は JavaScript をリードしているように見えるのが非常に興味深いです。: - Java は以前から Date の現代的な代替手段を持っていますが、JavaScript の最近標準化された Temporal API はまだ Safari でサポートされていません。 - Java には switch 式がありますが、JavaScript は Scheme の影響を受けているにもかかわらず、持っていません。 - そして今、Java は value object を取得しようとしていますが、JavaScript の同等の tuples & records プロポーザルは撤回されました。 – @sheept
List<T>やComparable<T>のようなジェネリック型は、型引数に value class を使用してインスタンス化できます。JEP 218, Generics over Primitive Types (with revisions) により、ジェネリッククラスやメソッドが value class 型によってパラメータ化されたときに、フィールド、配列、ローカル変数のレイアウトを特化できるようになります。これは素晴らしい!JVM は、より良いメモリ割り当てと最適化のために、コンパイル時に既知の値サイズを使用する方法をさらに必要としています。 – @ivanjermakov もし私がこれを正しく理解しているなら、Integer は value class になり、そのすべてのインスタンスがオブジェクトのアイデンティティを失うことになります。詳細についてはあまり知識がありませんが、当初から見て、これはかなり大胆な動きのように思えます。 – @weinzierl Project Valhalla に関する以前の HN の議論: https://news.ycombinator.com/item?id=48595511 – @kuhsaft この設計のこの部分の理由をいつも忘れてしまいます。なぜ value セマンティクスは使用時ではなく宣言時に組み込まれているのでしょうか?なぜクラスの作成者はそれを value 型として宣言しなければならないのでしょうか?Brian によって何度も再検討されていることは知っていますが、その理由をいつも忘れてしまいます。 – @swaranga 特化されたジェネリクスがまだ欠けているとはいえ、素晴らしいです。Scala は非常に強力な言語ですが、JVM 上での抽象化は大きな代償を伴うため、これらの改善は特に Scala に有益だと思います。 – @pregnenolone 2934 個のコミット、なんてことだ... 膨大な作業だ。 – @germandiago 本当に素晴らしい。String がその不変性にもかかわらず、Integer のように完全に区別がつかないものになれないのは残念です。 – @parallax_error 最新の状況はどうですか?まだ 63 ビットのデータと null 許容性のための 1 ビットに制限されていますか? – @HexDecOctBin MR が閉じられました。これです https://github.com/openjdk/jdk/commit/cc278dbb8a1ca0754d5842... – @ligarota これは Valhalla のどれくらいですか?50%?90%? – @whytevuhuni 後で読むためにブックマーク – @hn4yci687u