Java 9 出来了,并且 Observer
已被弃用。这是为什么?这是否意味着我们不应该再实现观察者模式了?
最好知道什么是更好的选择?
原文由 curious95 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 9 出来了,并且 Observer
已被弃用。这是为什么?这是否意味着我们不应该再实现观察者模式了?
最好知道什么是更好的选择?
原文由 curious95 发布,翻译遵循 CC BY-SA 4.0 许可协议
还有更多的原因:
不可序列化——因为 Observable 没有实现可序列化。因此,您不能将 Observable 及其子类序列化。
没有线程安全——这些方法可以被其子类覆盖,事件通知可以以不同的顺序发生,并且可能发生在不同的线程上,这足以破坏任何“线程安全”。
少提供-
它们没有为应用程序提供足够丰富的事件模型。例如,他们只支持某些东西已经改变的概念,但他们不传达任何关于改变的信息
Open Issues—— 如前所述,提出了很多主要问题(线程安全、可序列化),其中大多数都有复杂的问题需要解决,但仍然“未解决”或 没有积极的开发,这就是它被 弃用 的原因。
我还建议阅读此答案 Why should the observer pattern be deprecated? ,@Jeff 解释了弃用的其他原因。
您可以使用 PropertyChangeEvent
和 PropertyChangeListener
来自 java.beans
包。
原文由 Ravi 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.3k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.1k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
这是为什么?这是否意味着我们不应该再实现观察者模式了?
先回答后半部分——
是 的,这确实意味着您不应该再实施
Observer
和Obervable
。为什么他们被弃用-
他们没有为应用程序提供足够丰富的事件模型。例如,他们只能支持某事发生变化的概念,但不传达任何关于发生变化的信息。
亚历克斯的回答 很好地预先指出 _
Observer
有一个弱点:所有Observable
都是相同的_。您必须实现基于instanceof
的逻辑,并将对象转换为具体类型Observable.update()
方法。要添加到它还有一些错误,比如 无法序列化
Observable
类,因为它没有实现Serializable
接口,它的所有成员都是私有的。有什么更好的选择呢?
另一方面
Listeners
有很多类型,它们有回调方法,不需要转换。正如@Ravi 在他的 回答 中指出的那样,您可以改用PropertyChangeListener
。对于它的其余部分
@Deprecation
已标记有适当的文档以探索其他答案中链接的其他包。请注意,弃用还标有 此邮件 中所述的分析 -
编辑:还值得一提的是,API 的弃用不仅主要是因为上述原因,而且无法维护在一些错误报告(上面链接)的评论中提到的遗留代码,这些错误报告被提出以一种或另一种方式标记其实施的改进。