Java的Observable类的替代品?

Hol*_*osa 19 java events observable observer-pattern

我是从C#世界来到Java的,其中Observer模式被实现为带有event关键字的一流语言结构.

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

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

Jon*_*oni 17

通常,观察者模式在需要时使用ad-hoc解决方案实现.当谈到行为模式时,它是最简单的方法之一:两种控制"观察者"列表的方法,以及一种在发生有趣事情时通知观察者的方法.

观察者模式往往在某些域之外很少出现,并且当它确实出现时,它往往对应用程序域过于具体,因此通用解决方案几乎没有价值.您可以看到java.util.Observable该类的问题:如果您继承,Observable则必须接受可能传递给您的所有可能类型的"观察者",这可能对您的应用程序没有意义:

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

也就是说,来自Google Guava的EventBus似乎在通过采用完全不同的方法简化事件生成和处理方面做得相当不错.

之前已经在SO上讨论了基于注释的其他技术.


thS*_*oft 6

我建议研究反应式编程.Java只有一个我知道的实现:reactive4java.