在Java 9中不推荐使用Observer.我们应该使用什么而不是它?

cur*_*s95 122 java deprecated observer-pattern java-8 java-9

Java 9问世,Observer已被弃用.这是为什么?这是否意味着我们不应该再实施观察者模式了?

知道什么是更好的选择会很好吗?

Nam*_*man 93

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

首先回答后一部分 -

YES,它意味着你不应该实施ObserverObervable小号了.

为什么他们被弃用 -

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

亚历克斯的回答很好地预先设定了Observer一个弱点:所有Observable的都是相同的.您必须实现基于的逻辑instanceof并将对象转换为具体类型到Observable.update()方法中.

要添加它,有一些错误,如无法序列化Observable类,因为它没有实现Serializable接口,其所有成员都是私有的.

有什么更好的替代方案?

另一方面,Listeners有很多类型,他们有回调方法,不需要铸造.正如@Ravi在他的回答中指出的那样,你可以使用它 PropertyChangeListener.

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


请注意,弃用也标有此邮件中所述的分析 -

现在,任何遇到这些的人都可能在使用RxJava或其他反应流框架时错误地击中它们.在这种情况下,用户通常希望使用jdk9 java.util.concurrent.FlowAPI,所有反应流框架应该在其计划的即将推出的jdk9兼容版本中兼容/互操作.

编辑:还值得一提的是,API的弃用主要不仅仅是因为上述原因,而且还无法维护上面提到的一些错误报告(上面链接的)的评论中提到的遗留代码.以一种或另一种方式改进其实施.

  • 特定实现被弃用的事实并不意味着Observer*模式*存在致命缺陷.`Listener`也是一个观察者. (22认同)
  • +1。好的答案,尽管我仍在努力理解。是由于设计模式本身的某些固有问题(由GOF在书中定义)还是Java支持该模式的问题而弃用Java中的Observer?在其他OO语言(例如C#,C ++,Python)中,观察者设计模式是否也具有与Java中相同的问题? (3认同)
  • @ curious95是的,调用`notifyObservers()`是并发的.这是来自同一个共享的[codelet](https://bugs.openjdk.java.net/browse/JDK-4212311),详细解释了它的功能. (3认同)

Rav*_*avi 33

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


这是为什么?

还有更多原因:

不可序列化 - 因为,Observable不实现Serializable.所以,你不能将它的子类序列化为Observable.

无线程安全 - 方法可以被其子类覆盖,并且事件通知可以在不同的顺序中发生,并且可能在不同的线程上发生,这足以破坏任何"线程安全".

少提供 -

它们没有为应用程序提供足够丰富的事件模型.例如,它们仅支持某些内容已发生变化的概念,但它们并未传达有关已发生变化的任何信息

开放性问题 - 如前所述,提出了许多重大问题(线程安全,Serializable),其中大多数都有复杂性需要修复,仍然"未修复"或" 无活动开发",这就是它被弃用的原因.

我还建议阅读这个答案为什么要弃用观察者模式?,@ Jeff解释了其他弃用原因.


那么,我们有什么选择呢?

您可以使用PropertyChangeEventPropertyChangeListener来自java.beans包.

  • 更新:我认为该方法是添加一个“PropertyChangeSupport”作为实例变量,但我希望得到确认。 (2认同)
  • @ LastStar007我认为你是对的。我在[Baeldung.com](https://www.baeldung.com/java-observer-pattern)上找到了一个代码示例。 (2认同)

Moh*_*agi 9

为什么在Java 9中不推荐使用Observer?

答:Observable类和Observer接口都在Java中9遭到反对,因为该事件模型的支持ObserverObservable是相当有限的,通知被传递的顺序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,SubscriberSubscription.

Flow.Processor :充当订阅服务器和发布服务器的组件.

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

Flow.Subscriber :消息的接收者.

Flow.Subscription:消息控制链接a Flow.PublisherFlow.Subscriber.

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


Ous*_* D. 7

考虑到Java 9 中的Observable类和Observer接口已被弃用.根据后续Java的Observer和Observable在JDK 9中已弃用

Observer和Observable支持的事件模型非常有限,Observable提供的通知顺序未指定,状态更改不与通知一一对应.对于更丰富的事件模型,请考虑使用该java.beans 包.对于线程间可靠且有序的消息传递,请考虑使用包中的一个并发数据结构 java.util.concurrent.有关反应流样式编程,请参阅Flow API.