Java9中不推荐使用Observer。我们应该用什么来代替它?
Java9问世了,并且已经被弃用。 为什么呢?这是否意味着我们不应该再实现观察者模式Java9中不推荐使用Observer。我们应该用什么来代替它?,java,java-8,deprecated,observer-pattern,java-9,Java,Java 8,Deprecated,Observer Pattern,Java 9,Java9问世了,并且已经被弃用。 为什么呢?这是否意味着我们不应该再实现观察者模式 考虑到自Java 9起,Observable类和Observable接口已被弃用,最好知道什么是更好的选择。据邮报报道 由观察者和可观察者支持的事件模型非常有限, Observable发送通知的顺序未明,且 状态更改不是一对一与 通知。 对于更丰富的事件模型,考虑使用 < /强> 包裹对于线程间可靠和有序的消息传递,请考虑 使用中的一个并发数据结构 软件包。有关反应流样式的编程,请参见流API 考虑到obser
考虑到自Java 9起,
Observable
类和Observable
接口已被弃用,最好知道什么是更好的选择。据邮报报道
由观察者和可观察者支持的事件模型非常有限,
Observable发送通知的顺序未明,且
状态更改不是一对一与
通知。
对于更丰富的事件模型,考虑使用<强> < /强>
包裹对于线程间可靠和有序的消息传递,请考虑
使用中的一个并发数据结构
软件包。有关反应流样式的编程,请参见流API
考虑到
observatable
类和observator
接口从Java9开始就被弃用了。据邮报报道
由观察者和可观察者支持的事件模型非常有限,
Observable发送通知的顺序未明,且
状态更改不是一对一与
通知。
对于更丰富的事件模型,考虑使用<强> < /强>
包裹对于线程间可靠和有序的消息传递,请考虑
使用中的一个并发数据结构
软件包。有关反应流样式的编程,请参见流API
原因还有很多: -因为,Observable不实现可序列化。因此,您不能序列化Observable及其子类 -方法可以被其子类覆盖,事件通知可以以不同的顺序发生,可能发生在不同的线程上,这足以破坏任何“线程安全” - 它们没有为应用程序提供足够丰富的事件模型。对于 例如,他们只支持某些东西已经改变了,但是 他们没有传达任何关于发生了什么变化的信息 未解决的问题-如前所述,出现了许多重大问题(线程安全、可序列化),其中大多数问题都很复杂,需要修复,但仍然“未修复”或没有活动开发,这就是它被弃用的原因 “我还建议你读一下这个答案,”杰夫解释了其他不赞成的原因
那么,我们还有什么选择呢?
您可以从软件包中使用和。还有更多原因: -因为,Observable不实现可序列化。因此,您不能序列化Observable及其子类 -方法可以被其子类覆盖,事件通知可以以不同的顺序发生,可能发生在不同的线程上,这足以破坏任何“线程安全” - 它们没有为应用程序提供足够丰富的事件模型。对于 例如,他们只支持某些东西已经改变了,但是 他们没有传达任何关于发生了什么变化的信息 未解决的问题-如前所述,出现了许多重大问题(线程安全、可序列化),其中大多数问题都很复杂,需要修复,但仍然“未修复”或没有活动开发,这就是它被弃用的原因 “我还建议你读一下这个答案,”杰夫解释了其他不赞成的原因
那么,我们还有什么选择呢?
您可以从软件包中使用和。为什么?这是否意味着我们不应该再实现观察者模式了? 首先回答后一部分: 是,这意味着您不应该再实施
Observer
和Obervable
s
-
他们没有为应用程序提供足够丰富的事件模型。例如,他们只能支持某些东西已经改变的概念,但没有传达任何关于什么已经改变的信息
很好地说明了Observer
有一个弱点:所有可观察的都是相同的。您必须实现基于instanceof
的逻辑,并将对象转换为具体类型,转换为Observable.update()
方法
要添加到它中,会出现类似于一个类的bug,因为它没有实现Serializable
接口,并且它的所有成员都是私有的
有什么更好的选择吗?
另一方面,侦听器
有很多类型,它们有回调方法,不需要强制转换。正如@Ravi在他的文章中指出的,你可以利用它
在剩下的部分中,@Deprecation
已经用适当的文档标记,以探索其他答案中链接的其他包
请注意,弃用还标记了分析,如-
这些天,任何人遇到这些可能是打他们
使用RxJava
或其他反应流框架时出错。在里面
在这种情况下,用户通常希望使用jdk9
java.util.concurrent.Flow
API,所有反应流框架
应在其计划的范围内兼容/互操作
jdk9兼容版本
编辑:同样值得一提的是,API的不受欢迎不仅仅是因为上述原因,还因为无法维护一些错误报告(上面链接的)评论中提到的遗留代码它们的提出是为了以一种或另一种方式标志着其实施的改进。