Observer 在 Java 9 中被弃用了。我们应该用什么来代替它?

新手上路,请多包涵

Java 9 出来了,并且 Observer 已被弃用。这是为什么?这是否意味着我们不应该再实现观察者模式了?

最好知道什么是更好的选择?

原文由 curious95 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

这是为什么?这是否意味着我们不应该再实现观察者模式了?

先回答后半部分——

的,这确实意味着您不应该再实施 ObserverObervable

为什么他们被弃用-

他们没有为应用程序提供足够丰富的事件模型。例如,他们只能支持某事发生变化的概念,但不传达任何关于发生变化的信息。

亚历克斯的回答 很好地预先指出 _Observer 有一个弱点:所有 Observable 都是相同的_。您必须实现基于 instanceof 的逻辑,并将对象转换为具体类型 Observable.update() 方法。

要添加到它还有一些错误,比如 无法序列化 Observable 类,因为它没有实现 Serializable 接口,它的所有成员都是私有的。

有什么更好的选择呢?

另一方面 Listeners 有很多类型,它们有回调方法,不需要转换。正如@Ravi 在他的 回答 中指出的那样,您可以改用 PropertyChangeListener

对于它的其余部分 @Deprecation 已标记有适当的文档以探索其他答案中链接的其他包。


请注意,弃用还标有 此邮件 中所述的分析 -

如今,遇到这些问题的任何人都可能在使用 RxJava 或其他反应流框架时误击了它们。在这种情况下,用户通常希望使用 jdk9 java.util.concurrent.Flow API,所有反应流框架都应该在他们计划的即将推出的 jdk9 兼容版本中兼容/互操作。

编辑:还值得一提的是,API 的弃用不仅主要是因为上述原因,而且无法维护在一些错误报告(上面链接)的评论中提到的遗留代码,这些错误报告被提出以一种或另一种方式标记其实施的改进。

原文由 Naman 发布,翻译遵循 CC BY-SA 4.0 许可协议

还有更多的原因:

不可序列化——因为 Observable 没有实现可序列化。因此,您不能将 Observable 及其子类序列化。

没有线程安全——这些方法可以被其子类覆盖,事件通知可以以不同的顺序发生,并且可能发生在不同的线程上,这足以破坏任何“线程安全”。

少提供-

它们没有为应用程序提供足够丰富的事件模型。例如,他们只支持某些东西已经改变的概念,但他们不传达任何关于改变的信息

Open Issues—— 如前所述,提出了很多主要问题(线程安全、可序列化),其中大多数都有复杂的问题需要解决,但仍然“未解决”或 没有积极的开发,这就是它被 弃用 的原因。

我还建议阅读此答案 Why should the observer pattern be deprecated? ,@Jeff 解释了弃用的其他原因。


那么,我们有什么选择呢?

您可以使用 PropertyChangeEventPropertyChangeListener 来自 java.beans 包。

原文由 Ravi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏