Actually Jasper and Scott just pointed out some problems here. I mistyped 
(should have been return _x; from the getter). But also I didn't handle the 
case of binding, or setting via the property correctly here. So this modified 
pattern doesn't work. I may be remembering it wrong and Alex can correct me.

Richard

On Jul 25, 2013, at 9:21 AM, Richard Bair <richard.b...@oracle.com> wrote:

>> Regarding memory requirements of the "full lazy" properties, let me state 
>> the obvious:
>> - if the property is not used at all, we have a reference and a double 
>> instead of just a reference (worse unless in bucket)
>> - if getters/setters are called, we still have a reference and a double 
>> instead of full instantiated property (better)
>> - if a listener is added, we have instantiated property and a double instead 
>> of just the property (slightly worse)
>> So it looks like it would make best sense to introduce this for properties 
>> that are often get/set but usually don't have listeners on them. I'm not 
>> sure if such set exists and can be identified.
> 
> Thanks Pavel, this is a good summary. Alex K. and I were looking at a pattern 
> for this once and he had another way to do it which was different than what I 
> had done in the past. The pattern I used to use was something like this:
> 
>    private double _x;
>    private DoubleProperty x;
> 
>    public final void setX(double value) {
>        if (x == null) {
>            _x = value;
>        } else {
>            x.set(value);
>    }
> 
>    public final double getX() {
>        return x == null ? _x : x.get();
>    }
> 
>    public final DoubleProperty xProperty() {
>        if (x == null) x = new DoubleProperty(this, "x", _x);
>        return x;
>    }
> 
> instead it could be done like this which results in faster getters (because 
> you never have to delegate to another method), an almost immeasurably slower 
> setter, and slightly little less code:
> 
>    private double _x;
>    private DoubleProperty x;
> 
>    public final void setX(double value) {
>        _x = value;
>        if (x != null) x.set(value);
>    }
> 
>    public final double getX() {
>        return x;
>    }
> 
>    public final DoubleProperty xProperty() {
>        if (x == null) x = new DoubleProperty(this, "x", _x);
>        return x;
>    }
> 
> 
> The idea here is to always set the local field, so that we can always just 
> return the value immediately in the getter. Where I think this may make a 
> difference is on the smaller end systems (mobile / embedded) because from 
> previous analysis we saw that none of our getters were getting inlined -- we 
> actually paid the price of each method call overhead, because since we were 
> reading from the property objects and the property objects were a couple 
> methods worth of work for each getter call, the VM wouldn't inline the 
> generated code into the call sites. By using this pattern in places that are 
> commonly read, we would probably get these getters all inlined again and 
> avoid all the method call overhead entirely.
> 
> Richard

Reply via email to