Observer在Java 9中已被弃用。我们应该使用什么来代替它?
Java 9出来了, Observer
已经被弃用了。 这是为什么? 这是否意味着我们不应该实施观察者模式了?
这将是很好的知道什么是一个更好的select?
这是为什么? 这是否意味着我们不应该实施观察者模式了?
先回答后半部分 –
是的 ,这意味着你不应该实现Observer
和Obervable
。
为什么他们弃用 –
他们没有为应用程序提供足够丰富的事件模型。 例如,他们只能支持某种东西已经改变的概念,但没有传达任何有关改变的信息。
亚历克斯的回答很好地说, Observer
有一个弱点:所有Observable
的都是一样的 。 您必须实现基于instanceof
的逻辑,并将对象转换为具体types到Observable.update()
方法。
为了增加它,有一些像无法序列化Observable
类的bug,因为它没有实现Serializable
接口,并且它的所有成员都是私有的。
什么是更好的select呢?
另一方面, Listeners
有很多types,他们有callback方法,不需要投射。 正如@Ravi在他的回答中指出的那样,您可以改用PropertyChangeListener
。
对于其余部分, @Deprecation
已经标记了适当的文档,以便在其他答案中探索其他链接。
请注意,该弃用也标有本邮件中所述的分析 –
现在,遇到这些问题的人可能会在使用
RxJava
或其他反应stream框架时RxJava
。 在这种情况下,用户通常会想使用jdk9java.util.concurrent.Flow
APIs,所有响应stream框架应该在其计划即将推出的jdk9兼容版本中兼容/互操作。
编辑 :另外值得一提的是,API的弃用主要不仅仅是因为上述原因,而且也无法维护这样的遗留代码,如上面提到的几个错误报告(链接上面)改善其实施方式。
是的,它在Java 9中已被弃用。 而且,我们不能实现观察者模式了。
这是为什么?
还有更多的原因:
不可序列化 – 因为,Observable没有实现Serializable。 所以,你不能序列化Observable和它的子类。
没有线程安全 – 方法可以被其子类覆盖,事件通知可以以不同的顺序发生,并且可能发生在不同的线程上,这足以破坏任何“线程安全”。
less提供 –
他们没有为应用程序提供足够丰富的事件模型。 例如,他们只支持一些事情已经改变的概念,但是他们没有传达任何有关改变的信息
开放性问题 – 如前所述,提出了很多重大问题(线程安全性,可序列化),其中大多数有复杂的修复,仍然是“不固定”或不活跃开发 ,这就是它被弃用的原因。
我也build议阅读这个答案为什么应该观察者模式被弃用? @Jeff解释了贬低的其他原因。
那么,我们有什么select?
您可以使用java.beans
包中的PropertyChangeEvent
和PropertyChangeListener
。
考虑到从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中已被弃用,因为Observer
和Observable
支持的事件模型相当有限, Observable
提供的通知顺序没有指定,状态变化也不是一一对应与通知。
请参阅Java文档https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
观察者模式的替代?
Observerdevise模式有许多替代scheme,Reactive Streams就是其中之一。
反应stream或streamAPI :
Flow
是Java 9中引入的一个类,具有4个相互关联的接口: Processor
, Publisher
, Subscriber
和Subscription
。
Flow.Processor
:充当订阅者和发布者的组件。
Flow.Publisher
:订阅者收到的项目的生产者。
Flow.Subscriber
:消息的接收者。
Flow.Subscription
:连接Flow.Publisher
和Flow.Subscriber
消息控制。
请参阅Java文档https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html