<i18n dev> RFR: 8366178: Implement JEP 526: Lazy Constants (Second Preview) [v16]
Maurizio Cimadamore
mcimadamore at openjdk.org
Fri Oct 17 14:30:05 UTC 2025
On Fri, 17 Oct 2025 13:13:45 GMT, Per Minborg <pminborg at openjdk.org> wrote:
>> Implement JEP 526: Lazy Constants (Second Preview)
>>
>> The lazy list/map implementations are broken out from `ImmutableCollections` to a separate class.
>>
>> The old benchmarks are not moved/renamed to allow comparison with previous releases.
>>
>> `java.util.Optional` is updated so that its field is annotated with `@Stable`. This is to allow `Optional` instances to be held in lazy constants and still provide constant folding.
>
> Per Minborg has updated the pull request incrementally with one additional commit since the last revision:
>
> Update docs after comments
src/java.base/share/classes/java/lang/LazyConstant.java line 157:
> 155: * a JVM implementation may, for an initialized lazy constant, elide all future reads of
> 156: * that lazy constant's contents and instead use the contents that has been previously
> 157: * observed. We call this optimization <em>constant folding</em>. This is only possible
This is still not ok.
First, there seems to be some typo ("if the reference to the lazy constant in a static final field or...").
Secondly, trusted chain _to_ such field. I think it's the other way around, the trusted chain starts at a static final field, and then eventually gets to the lazy constant, possibly traversing one or more trusted fields.
src/java.base/share/classes/java/lang/LazyConstant.java line 174:
> 172: * the lazy constant itself is collected (if ever).
> 173: * <p>
> 174: * A lazy constant whose contents is an array will not optimize access to
"While it's possible to store an array inside a lazy constant, doing so will not result in improved access to the array elements. Instead ..."
src/java.base/share/classes/java/lang/LazyConstant.java line 289:
> 287: *
> 288: * @param computingFunction in the form of a {@linkplain Supplier} to be used
> 289: * to compute the constant
s/compute/initialize (e.g. the term "compute the constant" is not defined anywhere)
src/java.base/share/classes/java/util/List.java line 1235:
> 1233: * or more lazy elements. The returned list's {@linkplain Object#toString() toString()}
> 1234: * method never triggers initialization of elements. Instead, an
> 1235: * implementation-dependant string is returned for uninitialized elements.
Suggestion:
* implementation-dependent string is returned for uninitialized elements.
src/java.base/share/classes/java/util/Map.java line 1788:
> 1786: * or more lazy values. The returned maps's {@linkplain Object#toString() toString()}
> 1787: * method never triggers initialization of values. Instead, an
> 1788: * implementation-dependant string is returned for uninitialized values.
Suggestion:
* implementation-dependent string is returned for uninitialized values.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2440193622
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2440203445
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2440207743
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2440209019
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2440216157
More information about the i18n-dev
mailing list