View Javadoc

1   /*
2    * Copyright (c) 2003-2008 by Cosylab d. d.
3    *
4    * This file is part of Java-Common.
5    *
6    * Java-Common is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10   *
11   * Java-Common is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with Java-Common.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  
20  package com.cosylab.util;
21  
22  /**
23   * A listener list is an efficient data structure for holding listeners. Its
24   * design is based on the fact that listeners are extensively accessed for
25   * event dispatching, but the collection of listeners changes rarely. Under
26   * these circumstances (especilly rare invocations of
27   * <code>addListener()</code> and <code>removeListener</code> methods) this
28   * class is a good choice. It holds listeners in an array that is trimmed
29   * every time the listener membership changes (which is quite inefficient). On
30   * the other hand, accessing the elements of the array is quick, <b>on the
31   * condition and contract that the client does not modify the array being
32   * returned</b>. Also note that the array is of the correct run-time type
33   * specified by the constructor of this class, and can therefore be cast. For
34   * example, if you speficy <code>WindowListener</code> as the RTT of this
35   * list, you can perform <code>WindowListener[] wla =
36   * (WindowListener[])toArray()</code> without raising a
37   * <code>ClassCastException</code>. For cases where the listener membership
38   * changes often, but events are dispatched rarely, use <code>ArrayList</code>
39   * instead. <b>This class is thread safe, there is no need for additional
40   * synchronization.</b> See also swing based listener registration for an
41   * approach that is more time consuming during dispatching, but can store
42   * different classes of listeners in a single array.
43   *
44   * @author <a href="mailto:gasper.tkacik@cosylab.com">Gasper Tkacik</a>
45   * @version $id$
46   *
47   * @see javax.swing.event.EventListenerList
48   */
49  public class ListenerList extends ObjectList
50  {
51  	/**
52  	 * Constructs a new instance of the listener list that will be used to hold
53  	 * elements of type <code>type</code>.  The specified class should be a
54  	 * subclass of <code>java.util.EventListener</code>.
55  	 *
56  	 * @param type a run-time type of the elements in this list
57  	 *
58  	 * @throws NullPointerException DOCUMENT ME!
59  	 * @throws IllegalArgumentException DOCUMENT ME!
60  	 */
61  	public ListenerList(Class type)
62  	{
63  		super(type);
64  
65  		if (type == null) {
66  			throw new NullPointerException("type");
67  		}
68  
69  		if (!java.util.EventListener.class.isAssignableFrom(type)) {
70  			throw new IllegalArgumentException("Type '" + type
71  			    + "' does not extend 'java.util.EventListener'.");
72  		}
73  	}
74  }
75  
76  /* __oOo__ */