我正在学习Java,并且希望将自己的课堂变成可观察的课堂。
但是我已经有了它扩展了另一个类。
我该怎么办?
我建议避免Observable完全使用该类,而应 定义事件特定的侦听器和相应的事件定义 。然后在您的类中定义一个侦听器列表,以及添加和删除侦听器以及向其传播事件的方法(请参见下文)。
Observable
Observable强制您使用它java.lang.Object来表示事件,然后使用来检查事件类型instanceof,这是一种丑陋的非OO方法,并使代码更难以理解。如果查看javax.swing包中的类,您会发现它们完全避免使用Observer/,Observable并且使用类似于以下的方法。
java.lang.Object
instanceof
Observer
事件定义
public class MyChangeEvent extends EventObject { // This event definition is stateless but you could always // add other information here. public MyChangeEvent(Object source) { super(source); } }
侦听器定义
public interface MyChangeListener { public void changeEventReceived(MyChangeEvent evt); }
类定义
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); } } }