API REVIEW: Weak event handler

John Hendrikx hjohn at xs4all.nl
Fri Jun 15 06:36:48 PDT 2012

I can't speak for Richard, but this looks very much in line with the 
existing WeakChangeListener and WeakInvalidationListener -- I think it's 
good to do this one in a similar fashion for consistency.


On 15/06/2012 12:38, Lubomir Nerad wrote:
> Hi Richard,
> haven't got any answer from you. I would like to make some progress 
> with this, so here is an updated WeakEventHandler, which should be 
> more to your liking:
> public final class WeakEventHandler<T extends Event>
>         implements EventHandler<T> {
>     public WeakEventHandler(EventHandler<T> eventHandler) { ... }
>     public boolean wasGarbageCollected() { ... }
>     @Override public void handle(T event) { ... }
> }
> I removed WeakReference and the factory method, added the additional 
> test method (as in WeakListener) and the public constructor.
> Is it OK now?
> Thanks,
> Lubo
> On 6/13/2012 12:57 PM, Lubomir Nerad wrote:
>> Hi Richard,
>> On 6/12/2012 10:01 PM, Richard Bair wrote:
>>> Hi Lubo,
>>>> I also considered to define the WeakEventHandler as an interface 
>>>> which extends EventHandler, but adds no additional methods. Then 
>>>> leave it to event handler containers to reference such event 
>>>> handlers weakly. This has very simple and direct usage, but also 
>>>> its own problems. We can discuss it further if you find this 
>>>> solution preferred to the wrapper approach.
>>> Extending WeakReference and lacking the public constructor did make 
>>> me a little weak in the knees :-).
>> Well, we can of course remove WeakReference from extends and have it 
>> as an instance in WeakEventHandler. But then we need to add some 
>> method to  test whether the target handler has been garbage collected 
>> and will have one more instance for each created WeakEventHandler. So 
>> extending WeakReference seemed to me worth considering. On the other 
>> hand having additional test method is more consistent with 
>> Weak*Listener from javafx-beans so we will probably end up with it. 
>> As to the public constructor, I don't like having both (the factory 
>> method and constructor) and in this case the factory method seems to 
>> be easier to use.
>>> What were the problems with WeakEventHandler being an interface?
>> When somebody wants to register a single event handler weakly 
>> multiple times, in the case of WeakEventHandler as a wrapper (the 
>> first case), he needs only to create a single instance of it and 
>> register it multiple types. In the case of WeakEventHandler as a 
>> marker (the second case), each time he registers such event handler a 
>> new instance of weak reference needs to be created by the container 
>> for it. Also if such weak event handler is set to an event handler 
>> property (for example Node.setOnMousePressed), the property 
>> implementation needs to be ready for it and create a weak reference 
>> to it. Then when such event handler is finally garbage collected, the 
>> property needs to return null and ideally at the point of garbage 
>> collection it should notify its listeners (if any) about value change.
>>> Thanks!
>>> Richard
>> Lubo

More information about the openjfx-dev mailing list