当扩展另一个类时,如何使类扩展Observable?

unj*_*nj2 24 java

我正在学习Java,我希望将我的课程变成一个可观察的课程.

但是我已经扩展了另一个类.

我该怎么办?

Ada*_*ski 41

我建议Observable完全避免使用该类,而是定义特定于事件的侦听器和相应的事件定义.然后在类中定义一个监听器列表,以及添加和删除监听器的方法,并将事件传播给它们(见下文).

Observable强制您使用它java.lang.Object来表示事件,然后检查事件类型instanceof,这是一种丑陋的非OO方法,并使代码更难理解.如果你看一下javax.swing包中的类,你会看到他们避免使用Observer/ Observable完全使用类似于下面的方法.

事件定义

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

听众定义

public interface MyChangeListener {
  public void changeEventReceived(MyChangeEvent evt);
}
Run Code Online (Sandbox Code Playgroud)

类定义

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)