在Java 9中不推荐使用Observer。我们应该使用什么而不是它?

时间:2017-09-23 13:27:52

标签: java java-8 deprecated observer-pattern java-9

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

知道什么是更好的替代方案会很好吗?

5 个答案:

答案 0 :(得分:85)

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

首先回答后一部分 -

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

Why were they deprecated -

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

Alex's answer很好地预先确定 Observer有一个弱点:所有Observable都是相同的。您必须实现基于instanceof的逻辑,并将具体类型转换为Observable.update()方法。

要添加它,有一个could not serialize the Observable类的错误,因为它没有实现Serializable接口,并且它的所有成员都是私有的。

有什么更好的替代方案?

另一方面,Listeners有很多类型,并且它们有回调方法,并且不需要强制转换。正如@Ravi在answer中指出的那样,您可以使用PropertyChangeListener代替。

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

请注意,弃用也标有this mail -

中所述的分析
  

现在,任何遇到这些的人都可能会遇到他们   使用RxJava或其他反应流框架时出错。在   在哪种情况下,用户通常会想要使用jdk9   java.util.concurrent.Flow所有响应流框架的API   应该在计划的即将到来的内容中兼容/互操作   jdk9兼容版本。

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

答案 1 :(得分:31)

是的,它已在 Java 9 中弃用。而且,我们不能再实现观察者模式了。

为什么?

还有更多原因:

Not Serializable - 因为,Observable没有实现Serializable。所以,你不能将它的子类序列化为Observable。

No Thread Safety - 方法可以被其子类覆盖,事件通知可以在不同的顺序中发生,也可能在不同的线程上发生,这足以破坏任何“线程安全”。

Less to offer -

  

它们不为应用程序提供足够丰富的事件模型。对于   例如,他们只支持某些事情发生了变化的想法,但是   他们没有传达任何有关变化的信息

未解决的问题 - 如上所述,提出了很多重大问题(线程安全,Serializable),其中大多数都有复杂性需要修复,仍然“未修复”或无活动开发,这就是为什么已弃用

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

那么,我们有什么选择?

您可以使用 PropertyChangeEvent 包中的 PropertyChangeListener java.beans

答案 2 :(得分:9)

  

为什么在Java 9中不推荐使用Observer?

Ans:由于ObservableObserver支持的事件模型,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个相互关联的接口:ProcessorPublisherSubscriberSubscription

Flow.Processor:充当订阅者和发布者的组件。

Flow.Publisher:订阅者收到的项目的制作者。

Flow.Subscriber:消息的接收者。

Flow.Subscription:消息控件关联Flow.PublisherFlow.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模式。