Hi Tomas

Great idea! I can see how the InvalidationSubscriber idea would work – but it 
is just a concept right? There is no official API for this, right?

Randahl





On 22 Jan 2014, at 13:34, Tomas Mikula <tomas.mik...@gmail.com> wrote:

> Hi Randahl,
> 
> I'm curious about an example where you would take advantage of the behavior 
> where multiple addListener(listener) calls add the listener just once.
> 
> Anyway, here [1] are helper classes InvalidationSubscriber and 
> ChangeSubscriber that allow you to do that:
> 
> InvalidationSubscriber subscriber = new InvalidationSubscriber(observable, 
> listener);
> 
> subscriber.subscribe(); // registers the listener
> subscriber.subscribe(); // no-op
> 
> Cheers,
> Tomas
> 
> [1] https://gist.github.com/TomasMikula/8557825
> 
> On Wed, Jan 22, 2014 at 11:23 AM, Randahl Fink Isaksen <rand...@rockit.dk> 
> wrote:
> Hi Martin
> 
> While I agree your proposed solution would work, I still don’t understand why 
> JavaFX should keep on supporting duplicates in listener collections. Can 
> anyone come up with just 1 example of an application that might be depending 
> on having two listeners on the same Observable? E.g. this kind of code:
> 
> myObservable.addListener(myChangeListener); //add it
> myObservable.addListener(myChangeListener); //add it again
> 
> In what kind of situation would this sort of code make any sense?
> 
> If we all feel confident that the presence of duplicates listeners is always 
> an error, I warmly recommend changing the API to be duplicate free.
> 
> Yours
> 
> Randahl
> 
> 
> 
> 
> On 22 Jan 2014, at 11:07, Martin Sladecek <martin.slade...@oracle.com> 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.
> >
> > What do you think?
> >
> > JIRA link: https://javafx-jira.kenai.com/browse/RT-25613
> >
> > -Martin
> 
> 

Reply via email to