API REVIEW: Weak event handler
Jonathan Giles
jonathan.giles at oracle.com
Tue Jun 12 12:46:44 PDT 2012
For what it is worth, the UI controls team have a WeakEventHandler class
in com.sun.javafx.scene.control. It does not follow quite the same
direction as you have outlined, but you may find it interesting
nonetheless. It would be good to remove our implementation once the
public API becomes available, but I can't imagine you'd be adding the
WeakEventHandler as a feature into 2.2 now, would you?
-- Jonathan
On 12/06/2012 11:47 p.m., Lubomir Nerad wrote:
> Hi All,
>
> there is a request to add a WeakEventHandler to the API
> (http://javafx-jira.kenai.com/browse/RT-13706). This will be a simple
> wrapper for the target event handler to which it will delegate the
> handle calls. It will reference the target weakly and so it won't
> prevent it from being garbage collected.
>
> My proposal for this class is:
>
> package javafx.event;
>
> public final class WeakEventHandler<T extends Event>
> extends WeakReference<EventHandler<T>>
> implements EventHandler<T> {
>
> private WeakEventHandler(EventHandler<T> eventHandler) { ... }
>
> @Override public void handle(final T event) { ... }
>
> public static <T extends Event> WeakEventHandler<T>
> create(EventHandler<T> eventHandler) { ... }
> }
>
> I decided to make this class both an EventHandler (implements) and a
> WeakReference (extends). Mainly I needed to have some way how to test
> from event handler containers whether the target event handler for a
> stored wrapper has been garbage collected and so the wrapper can be
> removed as well. Extending WeakReference adds the required method
> (WeakReference.get()) and saves some object instances. It also brings
> the clear method, which can simplify testing of this feature.
>
> WeakEventHandler instances will be created through the create factory
> method. This is to avoid repetition of the event type during event
> handler registration.
>
> So instead of:
> node.setOnMousePressed(new WeakEventHandler<MouseEvent>(new
> EventHandler<MouseEvent>() { ... }));
>
> we can use:
> node.setOnMousePressed(WeakEventHandler.create(new
> EventHandler<MouseEvent>() { ... }));
>
> 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.
>
> Thanks,
> Lubo
>
More information about the openjfx-dev
mailing list