On 22.01.14 11:07, Martin Sladecek wrote:
> 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.

Well this would destroy the order! I expect listeners to be called in
the correct order not? Why doing a remove and not simply check if the
listener has already been added?

Tom

Reply via email to