Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make a Class extend Observable when it has extended another class too?

Tags:

I am learning Java and I want to make my class into an observable class.

However I already have it extending another class.

What should I do?

like image 792
unj2 Avatar asked Nov 01 '09 23:11

unj2


1 Answers

I'd recommend avoiding using the Observable class altogether, but rather define event-specific listeners and corresponding event definitions. Then define a list of listeners within your class along with methods to add and remove listeners, and propagate events to them (see below).

Observable forces you to use java.lang.Object to represent events and then check the event type using instanceof, which is an ugly non-OO approach, and makes the code more difficult to understand. If you look at the classes within the javax.swing package you'll see they avoided using Observer / Observable altogether and used an approach similar to the below.

Event Definition

public class MyChangeEvent extends EventObject {   // This event definition is stateless but you could always   // add other information here.   public MyChangeEvent(Object source) {     super(source);   } } 

Listener Definition

public interface MyChangeListener {   public void changeEventReceived(MyChangeEvent evt); } 

Class Definition

public class MyClass {   // Use CopyOnWriteArrayList to avoid ConcurrentModificationExceptions if a   // listener attempts to remove itself during event notification.   private final CopyOnWriteArrayList<MyChangeListener> listeners;    public class MyClass() {     this.listeners = new CopyOnWriteArrayList<MyChangeListener>();   }    public void addMyChangeListener(MyChangeListener l) {     this.listeners.add(l);   }    public void removeMyChangeListener(MyChangeListener l) {     this.listeners.remove(l);   }    // Event firing method.  Called internally by other class methods.   protected void fireChangeEvent() {     MyChangeEvent evt = new MyChangeEvent(this);      for (MyChangeListener l : listeners) {       l.changeEventReceived(evt);     }   } } 
like image 69
Adamski Avatar answered Nov 02 '22 04:11

Adamski