[8u] API Request: RT-25613, ObservableValue should have a hasListener(listener) method

Martin Sladecek martin.sladecek at oracle.com
Wed Jan 22 02:07:18 PST 2014


Hi all,
I would like to start discussion about an addition to API in Observable, 
ObservableValue and all Observable collections.
There were multiple requests for a way how to avoid duplicates in 
listeners lists. The way RT-25613 solves this is that it introduces 
public boolean hasListener(ListenerType listener) which would return 
true if the provided listener is already registered.

This has one significant drawback that all of Observable* are actually 
interfaces. Means we can only add hasListener as a defender method. The 
problem is with the default implementation. We cannot return anything 
meaningful, so we have to throw an UnsupportedOperationException. The 
problem is that this might blow up unexpectedly when some "older" 
Observable implementation is used. Also, it might be easy to miss when 
implementing the interface, since the IDE might not force you to 
implement it.

So as an alternative solution, I propose adding something like:

ensureListener(ListenerType listener)

which would make sure the listener is on the list and if a listener is 
already present, the number of times listener is registered on the 
Observable will NOT grow after this call.

The default implementation (for Observable) would look like this:

public default void ensureListener(InvalidationListener listener) {
     removeListener(listener);
     addListener(listener);
}

subclasses might do something more effective. The same would apply to 
ObservableValue and ChangeListener and Observable[List|Set|Map] and 
[List|Set|Map]ChangeListener.

What do you think?

JIRA link: https://javafx-jira.kenai.com/browse/RT-25613

-Martin


More information about the openjfx-dev mailing list