API REVIEW: Weak event handler

Lubomir Nerad lubomir.nerad at oracle.com
Fri Jun 15 03:38:43 PDT 2012


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