Potential Inlined JDK Classes

原文はこちら。
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ファクトリから返されるCollectionjava.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.Versionhttps://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/

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中