-
Type:
CSR
-
Resolution: Unresolved
-
Priority:
P4
-
Component/s: tools
-
None
-
source, behavioral
-
high
-
All instances of value classes, including classes like Integer, Optional, and LocalDate, behave differently under `==`, `!=`, and `synchronized`; existing `synchronized` statements may not compile
-
Java API, Language construct, add/remove/modify command line option
-
SE
Summary
Enhance the Java language with value classes and objects.
Problem
The JEP provides a high-level discussion motivating the feature.
In --enable-preview mode, the Java language needs the following new capabilities:
- A way to express, and validate, that a given class (abstract or concrete) has no dependency on identity
- Constraints on instance creation of these classes, so that final fields can never be observed to mutate
- Identity-free semantics for operations on reference types, including the
==and!=operators and thesynchronizedstatement - Automatically interpreting certain JDK classes to have no identity at compile time
Solution
Our solution enhances the Java language as follows:
- Introduce the
valuemodifier for classes (not interfaces or enums, but including records); avalueclass is eitherabstractor implicitlyfinal, and may not extend an identity class (other thanObject); instance fields are implicitlyfinal, and instance methods may not besynchronized - Require that the instance fields of a value class be assigned before the
super()constructor call; where this call is implicit, place it at the end, not the start, of a value class constructor body - Specify when two value class instances are "the same", and so will successfully pass a
==test; specify that asynchronizedstatement will throw when operating on a value class instance, and reject programs withsynchronizedstatements operating on final value class types - Designate certain JDK classes as value classes when in
--enable-previewmode
Any class files that declare or use value classes are marked as preview-versioned class files. (This includes all classes that use, e.g., Integer or Optional.)
javac also adds new checks to its -Xlint:serial warnings feature, identifying value classes that implement Serializable but that serialization cannot support (see also JDK-8317279).
The javax.lang.model API and javadoc tool include trivial enhancements to surface the value modifier.
A more comprehensive outline of the solution can be found in the JDK-8317277 description.
Specification
JLS changes are included in the attached spec change document bundle. See the file specs/value-objects-jls.html.
- csr of
-
JDK-8317277 Java language implementation of value classes and objects
-
- In Progress
-
- relates to
-
JDK-8339130 JVM implementation of value classes and objects
-
- Draft
-
-
JDK-8339199 Standard library implementation of value classes and objects
-
- Draft
-