RFR: 8277848 Binding and Unbinding to List leads to memory leak [v2]

Florian Kirmaier fkirmaier at openjdk.java.net
Wed Jan 5 18:17:18 UTC 2022


On Fri, 31 Dec 2021 12:53:54 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> Florian Kirmaier has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   JDK-8277848
>>   Added missing change
>
> Why are the new listener imlementations called `BaseChangeListener` and `BaseInvalidationListener`, i.e. why the _Base_?
> 
> Also, if you're going to the trouble of refactoring the existing listener implementation, have you considered merging the very similar implementations into a single class? You can then re-use the listener instance and save another object allocation in this way:
> 
> 
> private static class Listener<E> extends WeakReference<ListPropertyBase<E>>
>         implements InvalidationListener, ListChangeListener<E>, WeakListener {
>     Listener(ListPropertyBase<E> ref) {
>         super(ref);
>     }
> 
>     @Override
>     public boolean wasGarbageCollected() {
>         return get() == null;
>     }
> 
>     @Override
>     public void onChanged(Change<? extends E> change) {
>         ListPropertyBase<E> ref = get();
>         if(ref != null) {
>             ref.invalidateProperties();
>             ref.invalidated();
>             ref.fireValueChangedEvent(change);
>         }
>     }
> 
>     @Override
>     public void invalidated(Observable observable) {
>         ListPropertyBase<E> ref = get();
>         if (ref == null) {
>             observable.removeListener(this);
>         } else {
>             ref.markInvalid(ref.value);
>         }
>     }
> }

@mstr2 
Great point. The chosen name was just because I needed a name. I switched now to the name "Listener".

I've now merged the ChangeListener with the Invalidation Listener, as you've suggested.
The PR should now improve the performance while fixing a bug. It might even be quite relevant because these classes are used very often.

-------------

PR: https://git.openjdk.java.net/jfx/pull/689


More information about the openjfx-dev mailing list