原文はこちら。
The original entry was written by Dustin Marx.
http://marxsoftware.blogspot.com/2020/07/potential-inlined-jdk-classes.html
(原文記事が出た週早々に)Dan Smithがvalhalla-spec-expertsメーリングリストに以下のタイトルのメールを投稿しました。
JEP draft: Identity Warnings for Inline Class Candidates
https://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2020-July/001347.html
valhalla-spec-experts mailing list
https://mail.openjdk.java.net/mailman/listinfo/valhalla-spec-experts
この投稿は、JDK-8249100に関連するJEPの草稿(Identity Warnings for Inline Class Candidates)の紹介でした。
JEP draft: Warnings for @ValueBased Classes
https://openjdk.java.net/jeps/8249100
Warnings for @ValueBased Classes
https://bugs.openjdk.java.net/browse/JDK-8249100
このJEPの主たる意図は、特定Java SE APIのクラスがインライン・クラスになる場合に変化する振る舞いに対し、コンパイル時、ならびに実行時に警告を出す、というものです。こうした警告によってJava開発者が来たる変更や変更の可能性があることを認識できるというのはよいアイデアだと思いますが、このドラフトJEP(JDK Enhancement Proposal)で提供されている背景の詳細は、最終的な目的と同じくらい興味深いものだと思います。数多くのスレッドやメーリングリストのメッセージで議論された議論や判断を、このドラフトJEPでは1個の簡単に参照される場所に統合されています。
Inline Classes in Java
JEP草稿のMotivationのセクションでは、インライン・クラスとは
インスタンスがアイデンティティを持たず、「インライン」または「フラットな」表現が可能であることを宣言する。インライン・クラスのインスタンスを、メモリ・ロケーション間で自由にコピーでき、インスタンスのフィールドの値のみを使用してエンコードできる。
と述べています。同じセクションでは、アイデンティティを持たないインライン・クラスがサポートしない 2 つの操作(synchronizedを使った監視とロック、そしてnewを使うインスタンス化)についても概説しています。
Diagnose synchronization on primitive wrappers
https://bugs.openjdk.java.net/browse/JDK-8242263
Locking on primitive boxes
https://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2020-February/001237.html
インライン・クラスでは特定の操作が許可されず、また、これらの操作で使用される可能性のある現在の JDK クラスのいくつかは、ある時点でインライン・クラスに移行される可能性があるため、この JEPのドラフト版で提案された警告があることが望ましいです。これらの警告は、将来的にインライン・クラスではサポートされない(最終的にはエラーになります)これらの操作とともに、これらのインライン・クラス候補のJDKクラスを現在使用していることを開発者に警告します。
インライン・クラスの背景については、2020年3月版の「State of Valhalla」ドキュメントを参照してください。
State of Valhalla — Section 1: The Road to Valhalla
http://cr.openjdk.java.net/~briangoetz/valhalla/sov/01-background.html
https://logico-jp.io/2019/12/26/state-of-valhalla-section-1-the-road-to-valhalla/
この中で、Brian Goetzが以下のような見解を述べています。
- インライン・クラスはオブジェクトの同一性を明示的に否定する異種集合体である
- インライン・クラスはイミュータブルでなければならず、多様性のあるレイアウトであってはならない。
- インライン・クラスには通常の(アイデンティティを持つ)クラスと比較していくつかの制限がある。
- インライン・クラスはfinalである
- インライン・クラスのフィールドはfinalである
- 継承への参加は制限されている
- “インライン・クラスは、クラスで利用可能なほとんどのメカニズムを使用できる。例えば
- メソッド
- コンストラクタ
- フィールド
- カプセル化
- 型変数
- アノテーション、など
- インライン・クラスのスローガンは”Codes like a class, works like an int”(クラスのようにコードを書き、intのように動作する)
- インライン型は、’faster classes’(より高速なクラス)や’user-definable primitives’(ユーザー定義可能なプリミティブ)と同様に考えることができる。
Identified JDK Inline Class Candidates
JEP草稿のDescriptionのセクションで、いくつかのクラスをリストアップし、インライン・クラスになりそうなクラスをグループ化しています。これらのJDKインライン・クラスの候補はこのエントリ執筆時点で以下のようなものがあります。
プリミティブラッパー (Boxxed primitives) | java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double java.lang.Boolean java.lang.Character |
Optionalクラス | java.util.Optional java.util.OptionalInt java.util.OptionalLong java.util.OptionalDouble |
Java Timeクラス | java.time.Instant java.time.LocalDate java.time.LocalTime java.time.LocalDateTime java.time.ZonedDateTime java.time.ZoneId java.time.OffsetTime java.time.OffsetDateTime java.time.ZoneOffset java.time.Duration java.time.Period java.time.Year java.time.YearMonth java.time.MonthDay java.time.chrono パッケージの選択クラス |
Collectionファクトリから返されるCollection | java.util.List.of java.util.List.copyOf java.util.Set.of java.util.Set.copyOf java.util.Map.of java.util.Map.copyOf java.util.Map.ofEntries java.util.Map.entry |
java.lang.Runtime.Version | https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Runtime.Version.html |
java.lang.ProcessHandlesの実装 | https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/ProcessHandle.html |
java.lang.constant.ConstantDescの実装 (java.lang.Stringを除く) | https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/constant/ConstantDesc.html |
jdk.incubator.foreignモジュールの選択クラス | https://docs.oracle.com/en/java/javase/14/docs/api/jdk.incubator.foreign/module-summary.html |
JDK Classes That Will Not Be Inlined
JDK が提供するクラスの中には、一見インライン・クラスの候補のように見えても、移行される可能性が低い特性を持っているものがいくつかあります。これらには、java.lang.String、java.math.BigInteger、java.math.BigDecimalなどがあります。
java.lang.String
https://www.reddit.com/r/java/comments/hp81zh/jep_draft_identity_warnings_for_inline_class/fxqdfh3/
java.math.BigInteger / java.math.BigDecimal
https://www.reddit.com/r/java/comments/hp81zh/jep_draft_identity_warnings_for_inline_class/fxorwn7/
Conclusion
このエントリで説明した先頃提案されたJEPの草稿では、Project Valhallaの一環で議論され、取り組まれている現在計画中のインライン・クラス機能に関する最新の背景の詳細についてまとめられています。これは現在作業中の機能に関するJEPの草稿であることに留意してください。そしてこのJEPの草稿は、インライン・クラスがJavaクラスの記述や利用方法をどのように変えるのか、インサイトをもたらしています。
Project Valhalla
https://openjdk.java.net/projects/valhalla/