Good point on PAYG.

If we use #2 with one-time lazy evaluation, I think that’s the best of both 
worlds.

Thanks,
Harbs

> On Nov 5, 2019, at 6:44 PM, Alex Harui <[email protected]> wrote:
> 
> Yeah, in my local branch I'm playing with various ways to not run the 
> initializer more than once.  We can tweak the pattern later.  It involves 
> re-defining the property, but isn't  quite the patterns offered below.
> 
> IMO, #2 is more PAYG than #1.  In #1, all initializers run regardless of 
> whether your code uses that value or not.  In #2, the initializers run on 
> demand, which is actually somewhat more like the Flash runtime.  AIUI, Flash 
> does not run a class's static initializers until the class is about to be 
> accessed by code.  All initializers for a class then run, but if your code 
> never gets to the point where the verifier needs to verify the class, the 
> initializers are not run.
> 
> -Alex
> 
> On 11/4/19, 11:49 PM, "Greg Dove" <[email protected]> wrote:
> 
>    Yeah, in all cases where I had to do this manually I used a private static
>    backing var and populated it on first request similar to what is typically
>    done for singleton-like get accessors. Otherwise it's not really safe
>    compared to the original (and as you say, could have performance issues
>    too).
> 
>    On Tue, 5 Nov 2019, 20:31 Harbs, <[email protected]> wrote:
> 
>> It seems to me that the getter approach can have an impact on performance.
>> With approach #1, the static consts will only be evaluated once, while with
>> #2, it will be evaluated every time it’s accessed.
>> 
>> Maybe we could use a hybrid approach where “bar” is redefined as the
>> evaluated value the first time it’s accessed.
>> 
>> Something like this:
>> 
>> Foo.get__bar = function() {
>>  var val = ResourceManager.getInstance().getString("baz");
>>  delete Foo.bar;
>>  Foo.bar = val;
>>  return val;
>> Object.defineProperty(Foo, "bar", {get: Foo.get__bar});
>> 
>> or maybe this:
>> 
>> Foo.get__bar = function() {
>>  var val = ResourceManager.getInstance().getString("baz");
>>  // is delete needed?
>>  delete Foo.bar;
>>  Object.defineProperty(Foo, "bar", {get: function(){return val}});
>>  return val;
>> }
>> Object.defineProperty(Foo, "bar", {get: Foo.get__bar});
>> 
>> 
>> Harbs
>> 
>>> On Nov 5, 2019, at 2:52 AM, Alex Harui <[email protected]> wrote:
>>> 
>>> Hi,
>>> 
>>> The issue of complex static initializers and dependency order keeps
>> coming up.  In reviewing the past discussions, there were a couple of
>> suggestions:
>>> 1) separate static initializers into a block of code that runs after the
>> class is defined
>>> 2) use getters
>>> 
>>> I'm going to try #2.  I'm not convinced #1 will work well with minifiers
>> or help us get the dependency order right.
>>> 
>>> Thoughts?  Is there a case where getters won't work?
>>> 
>>> For:
>>> 
>>> public class Foo {
>>> public static const bar:String =
>> ResourceManager.getInstance().getString("baz");
>>> }
>>> 
>>> We currently generate:
>>> 
>>> Foo.bar = ResourceManager.getInstance().getString("baz");
>>> 
>>> And lots of other code tries to understand that the
>> goog.require("ResourceManager") is more important than other goog.requires
>> in the remove-circulars dependency calculation.
>>> 
>>> But if we generate:
>>> Foo.get__bar = function() { return
>> ResourceManager.getInstance().getString("baz");};
>>> Object.defineProperty(Foo, "bar", {get: Foo.get__bar});
>>> 
>>> Then I think no statics will get evaluated at load time.
>>> 
>>> Of course, I could be wrong...
>>> -Alex
>>> 
>> 
>> 
> 
> 

Reply via email to