【问题标题】:Observer doesn't call update method观察者不调用更新方法
【发布时间】:2016-03-04 01:18:20
【问题描述】:

嘿,我有一个 MVC Java 应用程序,它使用观察者模式来通知我对每次更改的看法。
我有一个入门类来初始化所有类并为我的 MVC 模式设置一切。

public static void main(String[] args) {
        FXView view = new FXView();
        JSONModel model = new JSONModel();
        model.addObserver(view);
        Controller controller = new Controller(view, model);
        view.registerController(controller);
        FXView.launch(FXView.class);
}

我有一个从 Observable 扩展而来的模型,并且有一个写入文件的方法。那里我想打电话给setChanged()notifyObserver()

public void writeFile() {
        try {
            FileWriter file = new FileWriter("C://path/to/file.json");
            file.write(obj.toJSONString());
            file.flush();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        setChanged();
        notifyObservers(obj);
}

每次写入文件时,我都希望我的视图知道它。我的观点确实实现了Observer,因此具有update()方法。

@Override
public void update(Observable o, Object arg) {
    JSONModel model = (JSONModel)o;
    this.obj = model.getObj();
}

使用调试器时,我无法检测到对我的更新方法的调用。 当我启动程序时 --> 当我转到我的 Starter 类并调用“作为 Java 应用程序运行”时,我的模型会加载一个默认值,然后调用 writeFile()。文件被创建,setChanged()notifyObserver() 被调用,但update() 不会被调用。有什么我错过的吗?

【问题讨论】:

  • “notifyObservers”方法是什么样子的?
  • 只是来自java.util.Observable 的标准方法调用,我自己没有写任何东西。
  • "当我启动程序时" ...这意味着在模型的构造函数中? ...在添加观察者之前执行哪个?你可以尝试给 JSONModel 一个构造函数,你可以给它一个观察者。然后在ctor内部首先添加观察者,然后进行其余的初始化。
  • 抱歉写的不清楚。但我认为你说得有道理。我去看看。
  • @Fildor 解决了我的问题。

标签: java model-view-controller observer-pattern


【解决方案1】:

看起来,在启动阶段对 notifyOberservers 的调用是在添加 Oberserver 之前完成的。

这可以通过创建一个构造函数来解决,该构造函数在调用更新之前首先获取并添加一个观察者服务器。

另一种方法是空构造函数并将初始化代码移动到不同的方法。所以你可以在创建实例后调用addObserver,然后调用初始化方法。

就我个人而言,我会选择第一个,因为我们不希望能够创建未初始化(= 未定义状态)的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多