[ 
https://issues.apache.org/jira/browse/LANG-580?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12797257#action_12797257
 ] 

Oliver Heger commented on LANG-580:
-----------------------------------

I like the idea to add support for event listeners to [lang] because it can be 
tricky to implement this in a thread-safe and performant way.

That said I am not sure how much benefit the proposed solution would actually 
offer. IMO support for event listeners has two aspects: storing the registered 
listeners (i.e. the implementation of the {{addListener()}} and 
{{removeListener()}} methods, and firing events (i.e. {{fireXXX()}} methods). 
The {{EventSupport}} interface and the {{AbstractEventSupport}} class mainly 
focus on the former.

The JDK contains at least two classes I am aware of that are well suited for 
managing event listeners:
* {{javax.swing.event.EventListenerList}} is used by Swing and is a bit more 
complicated because it can deal with event listeners of multiple types.
* {{java.util.concurrent.CopyOnWriteArrayList}} is from its semantics a proper 
choice for storing event listeners.

So {{AbstractEventSupport}} would probably be a thin wrapper over one of these 
classes. Would this really provide benefit for users? If we could add some 
support for the {{fire()}} methods, the answer would be a clear yes, but I 
don't know how this can be achieved (it would probably be easier if Java had 
support for closures).

> Add Event Support Utilities
> ---------------------------
>
>                 Key: LANG-580
>                 URL: https://issues.apache.org/jira/browse/LANG-580
>             Project: Commons Lang
>          Issue Type: New Feature
>          Components: General
>    Affects Versions: 3.0
>         Environment: Java SE 5.0+
>            Reporter: Michael Wooten
>            Priority: Minor
>             Fix For: 3.0
>
>   Original Estimate: 96h
>  Remaining Estimate: 96h
>
> I would like to propose some support be added to Lang for basic event 
> handling. This would be based on the way that PropertyChangeSupport can be 
> used to add and remove listeners and post events. 
> Add interface EventSupport<L extends EventListener> 
> addListener(L listener)
> The signature for the method that can add a listener of some subtype of 
> EventListener
> removeListener(L listener)
> The signature for the method that can remove a listener of some subtype of 
> EventListener
> Add class AbstractEventSupport implements EventSupport<L>, Iterable<L>
> AbstractEventSupport(Object eventSource)
> Constructs a new AbstractEventSupport object and associates it with the 
> object that will be used as the source of all events (much like 
> PropertyChangeSupport).
> addListener(L)
> An implementation that adds a listener to an internal collection.
> removeListener(L)
> An implementation that removes a listener from an internal collection.
> iterator()
> Returns an iterator over the attached listeners.
> getSource()
> Returns a reference to the source object of all events.
> The best way to describe this would be to demonstrate an example of how it 
> can be used.
> public class ButtonPressedEventSupport extends 
> AbstractEventSupport<ButtonPressedListener> {
>     public ButtonPressedEventSupport(Object source) { super(source); }
>     public void fireButtonPressed(Button button) {
>         ButtonPressedEvent bpe = new ButtonPressedEvent(getSource(), button);
>         for (ButtonPressedListener listener : this)
>         {
>             listener.buttonPressed(bpe);
>         }
>     }
> }
> public class MyWindow implements EventSupport<ButtonPressedListener> {
>      private final ButtonPressedEventSupport buttonPressedEventSupport;
>      public MyWindow { buttonPressedEventSupport = new 
> ButtonPressedEventSupport(this); }
>      public void addListener(ButtonPressedListener listener) { 
> buttonPressedEventSupport.addListener(listener); } 
>      public void removeListener(ButtonPressedListener listener) { 
> buttonPressedEventSupport.removeListener(listener); } 
>      ...
>     private void onDetectButtonPressed(Button button) {
>         buttonPressedEventSupport.fireButtonPressed(button);
>     }
> }
> I haven't compiled the above code. It's just an example of how these classes 
> could be used so that you're not constantly rewriting the code and interfaces 
> for adding and removing listeners, and it provides a fairly easy method of 
> creating methods to fire events.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to