java - 替代 Java 的 Observable 类?

标签 java events observer-pattern observable

我是从 C# 世界来到 Java 的,在 C# 世界中,观察者模式被实现为具有 event 关键字的一流语言结构。

我看到 Java 从早期就有 Observable 类,但它显然存在实现问题并且似乎没有被广泛使用。到目前为止,我只是在我的 Java 代码中滚动我自己的观察者模式实现,但我总是忍不住认为必须有一个更好的替代方案来总是输出这个样板代码。 Swing 中有 Listener 类,但它们似乎不适用于非 Swing 代码。

对于这个非常常见的问题,推荐的解决方案是什么?第三方库对我来说没问题。

最佳答案

通常,观察者模式在需要时使用临时解决方案来实现。当涉及到行为模式时,它是最简单的一种:两种方法来控制“观察者”列表,另一种方法在发生有趣的事情时通知观察者。

观察者模式往往很少出现在某些领域之外,而且当它出现时,它往往过于特定于应用程序领域,因此通用解决方案没有什么值(value)。您可以看到 java.util.Observable 类的问题:如果您从 Observable 继承,则必须接受可能传递给您的所有可能类型的“观察者” ,这对您的应用程序可能没有意义:

  • 如果您的对象可以产生两种不同类型的事件,因此需要两个不同的观察者列表,该怎么办?
  • 如果观察者可能会根据事件影响您的对象怎么办,例如否决变更?

也就是说,EventBus from Google Guava通过采用完全不同的方法,似乎在简化事件生成和处理方面做得很好。

其他 techniques based on annotations have been discussed on SO之前。

关于java - 替代 Java 的 Observable 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218895/

相关文章:

javascript - 选中/取消选中所有复选框在 IE8 中不起作用

java - 主类和线程类之间的逻辑问题

Java Formatter 类 toString() 不起作用

java - 将 Java 转换为包含代码的 Kotlin BiFunction

java - 如果发生异常则转至Try block

c# - 调用事件,h(args) vs EventName?.Invoke()

javascript - 当点击单元格,输入值,但该值与之前的值相同时,Google脚本触发事件

events - PyQt graphicsview 调整大小事件

c++ - 实现 "Observer"模式的问题

c++ - 具有不同通知的观察者模式