Earlier this week, Dan Smith posted "JEP draft: Identity Warnings for Inline Class Candidates" on the valhalla-spec-experts mailing list. The purpose of this post was to introduce a draft JEP ("Identity Warnings for Inline Class Candidates") associated with JDK-8249100.
The main intent of this JEP is to "provide warnings at compile time and runtime for behaviors that will change when certain classes of the Java SE APIs become inline classes." Although I think it's a good idea to have these warnings to help Java developers recognize coming change and opportunities for change, I find the background details provided to in this draft JDK Enhancement Proposal to be as interesting as the end objective. This draft JEP consolidates discussions and decisions discussed among many different threads and messages on the mailing lists in a single easily referenced location.
Inline Classes in Java
The "Motivation" section of the draft JEP states that inline classes "declare their instances to be identity-free and capable of 'inline' or 'flattened' representations, where instances can be copied freely between memory locations and encoded using solely the values of the instances' fields." That same section also outlines two operations (monitoring/locking with synchronized
and instantiation with new
) that will not be supported by the identity-less inline classes. Because certain operations will not be allowed on inline classes and because some current JDK classes that may be used with these operations may be transitioned to inline classes at some point, it is desirable to have this draft JEP's proposed warnings. These warnings alert developers to their current uses of these inline class candidate JDK classes in conjunction with these operations that will not be supported on inline classes in the future (eventually an error will result).
For more background on inline classes, see the March 2020 version of the State of Valhalla document, in which Brian Goetz makes these observations:
- "Inline classes are heterogeneous aggregates that explicitly disavow object identity."
- Inline classes "must be immutable and cannot be layout-polymorphic."
- "Inline classes have some restrictions compared to ordinary (identity) classes; they are
final
, their fields arefinal
, and their ability to participate in inheritance is limited." - "Inline classes can use most mechanisms available to classes: methods, constructors, fields, encapsulation, type variables, annotations, etc"
- "The slogan" for inline classes "is Codes like a class, works like an
int
." - "Inline types could equally be thought of as 'faster classes' or 'user-definable primitives'."
Identified JDK Inline Class Candidates
The "Description" section of the draft JEP lists several bullets of classes and groups of classes that are "likely to become inline classes." These candidate JDK inline classes are listed, as of this writing, as follows:
- Primitive Wrapper Classes:
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 Classes:
java.util.Optional
,java.util.OptionalInt
,java.util.OptionalLong
,java.util.OptionalDouble
- Java Time Classes:
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, Duration
,java.time.Period
,java.time.Year
,java.time.YearMonth
,java.time.MonthDay
, and select classes injava.time.chrono
package. - Collections Returned from Collection Factories:
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
, andjava.util.Map.entry
- java.lang.Runtime.Version
- java.lang.ProcessHandles Implementations
- java.lang.constant.ConstantDesc Implementations (except
java.lang.String
) - Select Classes in the jdk.incubator.foreign Module
JDK Classes That Will Not Be Inlined
There are some JDK-provided classes that, at first thought, might seem like candidates to be inline classes, but turn out to have characteristics that make them unlikely to ever be transitioned. These include java.lang.String and java.math.BigInteger and java.math.BigDecimal.
Conclusion
The recently proposed draft JEP discussed in this post provides a centralized location for updated background details related to the currently planned inline classes feature being discussed and worked as part of Project Valhalla. Keeping in mind that this is a draft JEP about an in-work feature, this draft JEP provides insight into how inline classes will change how we write and use Java classes.