Feedback on LazyConstants (formerly StableValues)
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed Sep 24 14:49:59 UTC 2025
I see where you are headed.
The question now is: is the configuration known at construction, or is
it only known when we call get() ?
If the former, then we can express it as a lazy field of some sort
(perhaps one with a weird initialization action). But if the latter,
that's no longer "just" a lazy field, I think. Would you agree?
Maurizio
On 24/09/2025 15:20, david Grajales wrote:
> Hi Maurizio and Minborg. Thank you so much for the response. I will
> focus on explaining the part with the parameters for building objects.
> This scenario is not as unique at it may seems, I used a singleton
> because I thought it would be the easiest example but it's true it may
> not be the most representative. I will hold my thoughts until I test
> the new API. but I still would like to propose something. The supplier
> based factory requires to capture a reference to an external variable
> in case we need to set some parameters to create or compute the lazy
> constant, which can't hurt performance a little if used often.
>
> var conf = "conf";
> var foo2 = LazyCosntant.get(() -> {
> if (conf.isBlank()) {
> // do some validations
> }
> return new Foo(conf);
> });
>
> I think it would be worth considering adding a function based factory
> that accepts an object T (a configuration class to pass the
> parameters), and a function that accepts the parameter and returns the
> lazy computed value.
>
> private class Bar{
> public final String confParam1;
> public final int confParam2;
> public Bar(String param1, int param2){
> confParam1 = param1; confParam2 = param2;
> }
> }
>
>
> var bar = new Bar("conf1", 42);
> var foo2 = LazyValue.get(bar, s -> {
> if(/*Set some predicate for validation*/) {
> // do something
> }
> return new Foo(s);
> });
>
> I think it's cleaner and safer (also a little more performant since
> the parameter can be inlined and not captured as an external element,
> and since deferred initialization is pretty much about squeezing
> performance it may be worth considering this). besides it may
> internally check for T not null.
>
> Thank you so much and best regards.
>
>
>
> El mié, 24 sept 2025 a la(s) 7:02 a.m., Maurizio Cimadamore
> (maurizio.cimadamore at oracle.com) escribió:
>
>
> On 24/09/2025 11:38, Per-Ake Minborg wrote:
> > I think the other examples you show (albeit I didn't fully get how
> > they were supposed to work) would have issues regardless of whether
> > there were language or library support for lazy computation
>
> I'd like to amplify this point a little.
>
> Your example shows the use of a singleton -- an object that is
> constructed once, then stashed in a static final field.
>
> However, the construction of the singleton (getInstance method)
> depends
> on a parameter.
>
> This means that, effectively, getInstance will capture whatever
> parameter value was passed the first time it was constructed.
>
> Now, there might be use cases for this, but such a use case would
> also
> not be supported if using Kotlin's lazy, Scala's lazy val, or our
> LazyConstant API (all of them are equivalent from an expressiveness
> point of view).
>
> So, your claim that
>
> > this may indicate that a keyword or annotation-based solution
> could be
> > a better fit.
> Feels a bit off -- either the example you provided is not what you
> really had in mind, or, when you say _keyword_ you mean something
> other
> than a lazy-like keyword (but as Per explained, while there are some
> more obscure keywords in other languages that might provide more
> flexibility, the semantics associated with such keywords feels a bit
> ad-hoc, and surely not something we would like to permanently bolt
> onto
> the language).
>
> Cheers
> Maurizio
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20250924/271f412a/attachment-0001.htm>
More information about the amber-dev
mailing list