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

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

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

最好知道什么是更好的选择?

最佳答案

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

先回答后半部分——

YES,这确实意味着您不应该再实现 ObserverObervable

Why were they deprecated -

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

Alex's answer前面很好地说明了 Observer 有一个弱点:所有 Observable 都是相同的。您必须实现基于 instanceof 的逻辑,并将对象转换为具体类型并放入 Observable.update() 方法中。

除此之外还有像 could not serialize the Observable 这样的错误。类,因为它没有实现 Serializable 接口(interface),并且它的所有成员都是私有(private)的。

有什么更好的替代方案?

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

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


请注意,弃用还标有 this mail 中所述的分析-

These days, anyone encountering these is probably hitting them by mistake while using RxJava or other reactive-stream frameworks. In which case, users will normally want to instead use the jdk9 java.util.concurrent.Flow APIs that all reactive-streams frameworks should be compatible/interoperable within their planned upcoming jdk9-compatible versions.

编辑:还值得一提的是,API 的弃用主要不只是因为上述原因,还因为无法维护上述遗留代码在对一些错误报告(上面链接)的评论中提出这些错误报告是为了以某种方式改进其实现。

关于java - Observer 在 Java 9 中被弃用了。我们应该用什么来代替它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43644540/

相关文章:

java - 限制unix box机器本身通过java Mail发送电子邮件

具有经度和纬度值的 Java K-Means

java.util.Objects.isNull vs object == null

c++ - 弃用 C++ 中类的旧名称

java - 为什么不推荐使用 JButton.enable?

java - 为什么不推荐使用 StringTokenizer?

java - Solr 查询未返回预期结果

java - java将每条记录存储到json数组

java - Wicket ajax 调用不会呈现我的新组件

当我释放的数量超过获取的数量时,Java 信号量会增加许可数量