Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pros and Cons of Listeners as WeakReferences

What are the pros and cons of keeping listeners as WeakReferences?

The big 'Pro' of course is that:

Adding a listener as a WeakReference means the listener doesn't need to bother 'removing' itself.

For those worried about the listener having the only reference to the object, why can't there be 2 methods, addListener() and addWeakRefListener()?

Those who don't care about removal can use the latter.

like image 736
pdeva Avatar asked Jun 14 '11 00:06

pdeva


1 Answers

First of all, using WeakReference in listeners lists will give your object different semantic, then using hard references. In hard-reference case addListener(...) means "notify supplied object about specific event(s) until I stop it explicitly with removeListener(..)", in weak-reference case it means "notify supplied object about specific event(s) until this object will not be used by anybody else (or explicitly stop with removeListener)". Notice, it is perfectly legal in many situations to have object, listening for some events, and having no other references keeping it from GC. Logger can be an example.

As you can see, using WeakReference not just solve one problem ("I should keep in mind to not forget to remove added listener somewhere"), but also rise another -- "I should keep in mind that my listener can stop listen at any moment when there is no reference to it anymore". You not solve problem, you just trade one problem for another. Look, in any way you've forced to clearly define, design and trace livespan of you listener -- one way or another.

So, personally, I agree with mention what use WeakReference in listeners lists is more like a hack than a solution. It's pattern worth to know about, sometimes it can help you -- to make legacy code work well, for example. But it is not pattern of choice :)

P.S. Also it should be noted what WeakReference introduce additional level of indirection, which, in some cases with extremely high event rates, can reduce performance.

like image 140
BegemoT Avatar answered Oct 16 '22 06:10

BegemoT