【问题标题】:define a class as Observable and Observer both将一个类定义为 Observable 和 Observer
【发布时间】:2012-10-17 11:06:23
【问题描述】:

从技术上讲,使用以下代码将Class 定义为ObservableObserver 似乎是可以的:

public class Data extends Observable implements Observer

但是,尝试实现它,它不起作用。

public class Data extends Observable implements Observer {

    @Override
    public void update(Observable o, Object o1) {
        System.out.println("SC");        
    }

    Integer A;
    String B;
    Float C;

    public Data() {
        this.addObserver(this);
    }

    public void setA(Integer A) {
        this.A = A;
        notifyObservers();
    }

    public void setB(String B) {
        this.B = B;
        notifyObservers();
    }

    public void setC(Float C) {
        this.C = C;
        notifyObservers(this.C);
    }

}

main 函数如下:

public static void main(String[] args) {
    Data d = new Data();
    d.setA(5);
    d.setB("Hi");
    d.setC(2.0f);
}

它应该打印一些“SC”,但它不工作。谁能描述一下原因?

【问题讨论】:

    标签: java design-patterns observer-pattern


    【解决方案1】:

    如果你不.setChanged(),那么.notifyObservers() 无效。如果您有单独的定义 Observable 和 Observers 的类,或者如果您有一个单独的类(如您的示例中所示),就会出现这种情况。

    尝试如下更改您的设置器:

    public void setC(Float C) {
      this.C = C;
      setChanged();  // <-- add this line
      notifyObservers(this.C);
    }
    

    来自Observable的文档,

    setChanged() 将此 Observable 对象标记为已更改hasChanged 方法现在将返回 true

    notifyObservers(Object arg) 如果这个对象发生了变化,如hasChanged方法所示,则通知其所有观察者,然后调用clearChanged方法表示该对象不再改变了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      相关资源
      最近更新 更多