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

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

这将是很好的知道什么是一个更好的select?

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

先回答后半部分 –

是的 ,这意味着你不应该实现ObserverObervable

为什么他们弃用 –

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

亚历克斯的回答很好地说, Observer有一个弱点:所有Observable的都是一样的 。 您必须实现基于instanceof的逻辑,并将对象转换为具体types到Observable.update()方法。

为了增加它,有一些像无法序列化Observable类的bug,因为它没有实现Serializable接口,并且它的所有成员都是私有的。

什么是更好的select呢?

另一方面, Listeners有很多types,他们有callback方法,不需要投射。 正如@Ravi在他的回答中指出的那样,您可以改用PropertyChangeListener

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


请注意,该弃用也标有本邮件中所述的分析 –

现在,遇到这些问题的人可能会在使用RxJava或其他反应stream框架时RxJava 。 在这种情况下,用户通常会想使用jdk9 java.util.concurrent.Flow APIs,所有响应stream框架应该在其计划即将推出的jdk9兼容版本中兼容/互操作。

编辑 :另外值得一提的是,API的弃用主要不仅仅是因为上述原因,而且也无法维护这样的遗留代码,如上面提到的几个错误报告(链接上面)改善其实施方式。

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


这是为什么?

还有更多的原因:

不可序列化 – 因为,Observable没有实现Serializable。 所以,你不能序列化Observable和它的子类。

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

less提供

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

开放性问题 – 如前所述,提出了很多重大问题(线程安全性,可序列化),其中大多数有复杂的修复,仍然是“不固定”或不活跃开发 ,这就是它被弃用的原因。

我也build议阅读这个答案为什么应该观察者模式被弃用? @Jeff解释了贬低的其他原因。


那么,我们有什么select?

您可以使用java.beans包中的PropertyChangeEventPropertyChangeListener

考虑到从Java 9开始, Observable类和Observer接口已被弃用。根据后期Java的Observer和Observable在JDK 9中被弃用

Observer和Observable支持的事件模型相当有限,Observable提供的通知的顺序是未指定的,状态变化并不是与通知一一对应。 对于更丰富的事件模型,可以考虑使用java.beans包。 为了在线程之间进行可靠和有序的消息传递,可以考虑使用java.util.concurrent包中的一个并发数据结构。 对于反应stream风格编程,请参阅Flow API。

为什么Observer在Java 9中被弃用?

Ans: Observable类和Observer接口在Java 9中已被弃用,因为ObserverObservable支持的事件模型相当有限, Observable提供的通知顺序没有指定,状态变化也不是一一对应与通知。

请参阅Java文档https://docs.oracle.com/javase/9​​/docs/api/java/util/Observable.html

观察者模式的替代?

Observerdevise模式有许多替代scheme,Reactive Streams就是其中之一。

反应stream或streamAPI

Flow是Java 9中引入的一个类,具有4个相互关联的接口: ProcessorPublisherSubscriberSubscription

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

Flow.Publisher :订阅者收到的项目的生产者。

Flow.Subscriber :消息的接收者。

Flow.Subscription :连接Flow.PublisherFlow.Subscriber消息控制。

请参阅Java文档https://docs.oracle.com/javase/9​​/docs/api/java/util/concurrent/Flow.html