Java 9问世了,Observer
已被弃用。
这是为什么?这是否意味着我们不应该再实施观察者模式了?
知道什么是更好的替代方案会很好吗?
答案 0 :(得分:85)
为什么?这是否意味着我们不应再实施观察者模式了?
首先回答后一部分 -
是 ,这意味着您不应该再实施Observer
和Obervable
。
他们没有为应用程序提供足够丰富的事件模型。例如,他们只能支持某些事情发生了变化,但没有传达任何有关变化的信息。
Alex's answer很好地预先确定 Observer
有一个弱点:所有Observable
都是相同的。您必须实现基于instanceof
的逻辑,并将具体类型转换为Observable.update()
方法。
要添加它,有一个could not serialize the Observable
类的错误,因为它没有实现Serializable
接口,并且它的所有成员都是私有的。
有什么更好的替代方案?
另一方面,Listeners
有很多类型,并且它们有回调方法,并且不需要强制转换。正如@Ravi在answer中指出的那样,您可以使用PropertyChangeListener
代替。
对于其余部分,@Deprecation
已经标记了适当的文档,以探索其他答案中链接的其他包。
请注意,弃用也标有this mail -
中所述的分析现在,任何遇到这些的人都可能会遇到他们 使用
RxJava
或其他反应流框架时出错。在 在哪种情况下,用户通常会想要使用jdk9java.util.concurrent.Flow
所有响应流框架的API 应该在计划的即将到来的内容中兼容/互操作 jdk9兼容版本。
编辑 :还值得一提的是,弃用API主要不仅仅是因为上述原因,而且还无法维护如上所述的遗留代码关于一些错误报告(上面已链接)的评论,这些报告是为了标记其实施方式的改进而采取的一种或另一种方式。
答案 1 :(得分:31)
是的,它已在 Java 9 中弃用。而且,我们不能再实现观察者模式了。
还有更多原因:
Not Serializable - 因为,Observable没有实现Serializable。所以,你不能将它的子类序列化为Observable。
No Thread Safety - 方法可以被其子类覆盖,事件通知可以在不同的顺序中发生,也可能在不同的线程上发生,这足以破坏任何“线程安全”。
它们不为应用程序提供足够丰富的事件模型。对于 例如,他们只支持某些事情发生了变化的想法,但是 他们没有传达任何有关变化的信息
未解决的问题 - 如上所述,提出了很多重大问题(线程安全,Serializable),其中大多数都有复杂性需要修复,仍然“未修复”或无活动开发,这就是为什么已弃用。
我还建议阅读这个答案Why should the observer pattern be deprecated?,@ Jeff已经解释了其他弃用原因。
您可以使用 PropertyChangeEvent
包中的 PropertyChangeListener
和 java.beans
。
答案 2 :(得分:9)
为什么在Java 9中不推荐使用Observer?
Ans:由于Observable
和Observer
支持的事件模型,Java 9中已弃用Observer
类和Observable
接口非常有限,Observable
提供的通知顺序未指定,状态更改与通知不是一对一的。
请参阅Java doc https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
观察者模式的替代?
Observer设计模式有很多选择,Reactive Streams就是其中之一。
Reactive Streams或Flow API :
Flow
是Java 9中引入的一个类,它有4个相互关联的接口:Processor
,Publisher
,Subscriber
和Subscription
。
Flow.Processor
:充当订阅者和发布者的组件。
Flow.Publisher
:订阅者收到的项目的制作者。
Flow.Subscriber
:消息的接收者。
Flow.Subscription
:消息控件关联Flow.Publisher
和Flow.Subscriber
。
请参阅Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
答案 3 :(得分:7)
从Java 9开始,考虑到Observable
类和Observer
接口已被弃用。根据帖子Java's Observer and Observable Are Deprecated in JDK 9
Observer和Observable支持的事件模型非常有限, Observable提供的通知顺序未指定,并且 国家的变化不是一对一的对应 通知。 对于更丰富的事件模型,请考虑使用
java.beans
包。对于线程间的可靠和有序消息传递,请考虑 使用其中一个并发数据结构java.util.concurrent
包。有关反应流样式编程,请参阅Flow API。
答案 4 :(得分:1)
问题出在名为Observer,Observable等的Java类/接口的错误Java实现中,但不是GoF Observer模式。