【发布时间】:2016-05-02 19:49:26
【问题描述】:
Java 是否有类似于 pubsub 或数据绑定的概念?
我正在学习 Java GUI(尤其是 Swing)。我有一些表单,我想通过在它们之间共享事件和单例对象来保持同步。在我知道的其他语言中,这是通过数据绑定或事件同步/触发来处理的。
我看到您可以进行source.getParent().doSomething() 之类的活动,但是来自网络开发,跟踪父母参考的想法对我来说似乎绝对是疯狂的。我想我总是可以追溯到父母,但这感觉不对。
这就是 Java 的工作方式吗?有什么方法可以影响项目,无论它们在应用程序中的什么位置?
我没有找到任何关于更类似于网络的处理方式的信息,例如冒泡和捕获事件生命周期的各个阶段。也许我一次保持多个表单/视图打开的方法对于 Java 的工作方式来说太奇怪了……我可以关闭/打开表单,初始化会获取更新的值。
不管我的设计好不好,我只是想学习 Java,所以即使这个特定的例子不适用,我仍然想知道如何在没有组件 A 的情况下从远处影响项目知道组件 B 正在监听。
在伪代码中,由于我不知道 Java 的表达方式,我希望能够做到:
无数据绑定
Foo 组件:
private void initialize() {
this.addEventListener(CONSTANTS.NAME_OF_EVENT, this.doSomething); // waits for somebody to tell us to update
}
private void doSomething() {
this.value = singleton.getInstance().value; // gets "123" from Bar's dispatch
...
}
而在Bar Component中,我希望能够做到:
private void triggerSomething() {
this.singleton.getInstance.setValue(123); // updates the singleton
this.dispatchEvent(CONSTANTS.NAME_OF_EVENT); // tells anybody who cares about NAME_OF_EVENT to do something about it (ideally, the singleton would do the dispatching but for clarity I separated them)
}
有数据绑定
Foo 组件:
private void initialize() {
this.singleton.getInstance().setValue(123);
}
在 Bar 组件 中,我希望 txtValue.setText() 通过绑定到单例值而神奇地发生。
private void initialize() {
txtValue.setText(this.singleton.getInstance().getValue());
}
【问题讨论】:
-
一般来说,是的。有许多绑定 API 甚至“事件总线”。奇怪的是,更好的解决方案是研究 MVC