cur*_*s95 122 java deprecated observer-pattern java-8 java-9
Java 9问世,Observer已被弃用.这是为什么?这是否意味着我们不应该再实施观察者模式了?
知道什么是更好的选择会很好吗?
Nam*_*man 93
这是为什么?这是否意味着我们不应该再实施观察者模式了?
首先回答后一部分 -
YES,它意味着你不应该实施Observer和Obervable小号了.
为什么他们被弃用 -
他们没有为应用程序提供足够丰富的事件模型.例如,他们只能支持某些事情发生了变化,但没有传达任何有关变化的信息.
亚历克斯的回答很好地预先设定了Observer一个弱点:所有Observable的都是相同的.您必须实现基于的逻辑instanceof并将对象转换为具体类型到Observable.update()方法中.
要添加它,有一些错误,如无法序列化Observable类,因为它没有实现Serializable接口,其所有成员都是私有的.
有什么更好的替代方案?
另一方面,Listeners有很多类型,他们有回调方法,不需要铸造.正如@Ravi在他的回答中指出的那样,你可以使用它 PropertyChangeListener.
对于其余部分,@Deprecation已经标记了适当的文档以探索其他答案中链接的其他包.
请注意,弃用也标有此邮件中所述的分析 -
现在,任何遇到这些的人都可能在使用
RxJava或其他反应流框架时错误地击中它们.在这种情况下,用户通常希望使用jdk9java.util.concurrent.FlowAPI,所有反应流框架应该在其计划的即将推出的jdk9兼容版本中兼容/互操作.
编辑:还值得一提的是,API的弃用主要不仅仅是因为上述原因,而且还无法维护上面提到的一些错误报告(上面链接的)的评论中提到的遗留代码.以一种或另一种方式改进其实施.
Rav*_*avi 33
是的,它在Java 9中已弃用.而且,我们不能再实现观察者模式了.
还有更多原因:
不可序列化 - 因为,Observable不实现Serializable.所以,你不能将它的子类序列化为Observable.
无线程安全 - 方法可以被其子类覆盖,并且事件通知可以在不同的顺序中发生,并且可能在不同的线程上发生,这足以破坏任何"线程安全".
少提供 -
它们没有为应用程序提供足够丰富的事件模型.例如,它们仅支持某些内容已发生变化的概念,但它们并未传达有关已发生变化的任何信息
开放性问题 - 如前所述,提出了许多重大问题(线程安全,Serializable),其中大多数都有复杂性需要修复,仍然"未修复"或" 无活动开发",这就是它被弃用的原因.
我还建议阅读这个答案为什么要弃用观察者模式?,@ Jeff解释了其他弃用原因.
您可以使用PropertyChangeEvent和PropertyChangeListener来自java.beans包.
为什么在Java 9中不推荐使用Observer?
答:在Observable类和Observer接口都在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个相互关联的接口:Processor,Publisher,Subscriber和Subscription.
Flow.Processor :充当订阅服务器和发布服务器的组件.
Flow.Publisher :订阅者收到的项目的生产者.
Flow.Subscriber :消息的接收者.
Flow.Subscription:消息控制链接a Flow.Publisher和Flow.Subscriber.
请参阅Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
考虑到Java 9 中的Observable类和Observer接口已被弃用.根据后续Java的Observer和Observable在JDK 9中已弃用
Observer和Observable支持的事件模型非常有限,Observable提供的通知顺序未指定,状态更改不与通知一一对应.对于更丰富的事件模型,请考虑使用该
java.beans包.对于线程间可靠且有序的消息传递,请考虑使用包中的一个并发数据结构java.util.concurrent.有关反应流样式编程,请参阅Flow API.
| 归档时间: |
|
| 查看次数: |
25619 次 |
| 最近记录: |