<i18n dev> RFR: 8366178: Implement JEP 526: Lazy Constants (Second Preview) [v12]
Maurizio Cimadamore
mcimadamore at openjdk.org
Fri Oct 17 10:20:09 UTC 2025
On Fri, 17 Oct 2025 09:25:01 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 javadocs
src/java.base/share/classes/java/lang/LazyConstant.java line 168:
> 166: * of that lazy constant and instead directly use any constant that it has previously
> 167: * observed. We call this optimization <em>constant folding</em>. This is only possible if
> 168: * the reference to the lazy constant is a VM constant (e.g. in cases where
Not sure talking about VM constant is good. We could alternatively say:
"if the lazy constant is stored in a static final field, either directly, or indirectly, via one or more trusted fields (i.e. any combination...)"
src/java.base/share/classes/java/lang/LazyConstant.java line 179:
> 177: * must be <em>non-null</em>, or a {@link NullPointerException} will be thrown.
> 178: *
> 179: * @apiNote Once a lazy constant is initialized with an object, the object cannot ever be
Once a lazy constant is initialized, its contents can never be removed...
src/java.base/share/classes/java/lang/LazyConstant.java line 182:
> 180: * removed. This can be a source of an unintended memory leak. More specifically,
> 181: * a lazy constant {@linkplain java.lang.ref##reachability strongly references}
> 182: * the object it was initialized with. Hence, a lazy constant will hold
s/the object it was initialized with/its contents (here and below)
src/java.base/share/classes/java/lang/LazyConstant.java line 186:
> 184: * is collected (if ever).
> 185: * <p>
> 186: * A {@code LazyConstant} that has a type parameter {@code T} that is an
"A lazy constant whose contents is an array will not optimize access to the the elements of such array. Instead, ..."
src/java.base/share/classes/java/lang/LazyConstant.java line 191:
> 189: * Instead, a {@linkplain List#ofLazy(int, IntFunction) lazy list} of
> 190: * arbitrary depth can be used, which provides constant components.
> 191: * More generally, a lazy constant can hold other lazy constants of
More generally... you said that in the composition section?
src/java.base/share/classes/java/lang/LazyConstant.java line 233:
> 231:
> 232: /**
> 233: * {@return the initialized contents. If not initialized, first computes and
"initialized contents" is not a term you have defined in this javadoc. `get` returns the contents of this lazy constant. If the lazy constant is not initialized...
src/java.base/share/classes/java/lang/LazyConstant.java line 267:
> 265: */
> 266: @Override
> 267: String toString();
I think it might be worth also defining a javadoc for equals/hashCode, to say explicitly that they will also not trigger initialization
src/java.base/share/classes/java/lang/LazyConstant.java line 284:
> 282: * directly.
> 283: *
> 284: * @param computingFunction in the form of a Supplier to be used to compute
Suggestion:
* @param computingFunction a {@code Supplier} used to initialize
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439138229
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439141653
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439144255
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439156012
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439150170
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439161143
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439169909
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439174349
More information about the i18n-dev
mailing list