嘿,我有一个MVC Java Applcation,它使用观察者模式通知我对每个变化的看法。
我有一个初学者类来初始化所有类并为我的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扩展的Model,它有一个写文件的方法。在那里,我想致电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类并调用“Run as Java Application”时,我的模型会加载一个默认值,然后调用writeFile()
。文件已创建,setChanged()
以及notifyObserver()
被调用,但不会调用update()
。有什么我错过的吗?
答案 0 :(得分:2)
看起来,在启动阶段对notifyOberservers的调用是在添加Oberserver之前完成的。
这可以通过在调用update之前创建一个首先接受并添加Oberserver的Contructor来解决。
另一种方法是空构造函数并将init代码移动到另一个方法。因此,您可以在创建实例后调用addObserver,然后调用初始化方法。
就个人而言,我会选择第一个,因为我们不希望能够创建未初始化的实例(=未定义状态)。