web-dev-qa-db-ja.com

ObserverはJava 9では推奨されません。

Java 9が登場し、 Observer は非推奨になりました。何故ですか?オブザーバパターンをもう実装すべきではないということですか。

より良い代替手段が何かを知っておくとよいでしょうか。

109
curious95

どうしてですか?オブザーバパターンをもう実装すべきではないということですか?

後半に最初に答える -

YESObserverObervablesをもう実装しないでください。

なぜ廃止されたのですか -

彼らはアプリケーションのための十分に豊富なイベントモデルを提供しませんでした。例えば、彼らは何かが変わったという概念だけを支持することができましたが、何が変わったかについての情報を伝えませんでした。

Alexの答えObserverには弱点があるということを前もって明確に示しています。すべてのObservablesは同じですinstanceofに基づいたロジックを実装し、オブジェクトをObservable.update()メソッドに具象型にキャストする必要があります。

それを追加するために、1つのようなバグがありました Observableをシリアル化できませんでした クラスはSerializableインターフェースを実装していなかったのでそのメンバーはすべてプライベートだったので。

それに代わるより良い方法は何ですか?

一方Listenersにはたくさんの型があり、それらにはコールバックメソッドがあり、キャストは必要ありません。 answer で@Raviが指摘しているように、代わりに PropertyChangeListener を利用することができます。

それ以外の部分では、@Deprecationは他の回答にもリンクされている他のパッケージを探索するための適切な文書でマークされています。


非推奨も このメール - に記載されているように分析でマークされていることに注意してください。

最近では、RxJavaやその他のリアクティブストリームフレームワークを使用しているときに、これらに遭遇した誰かがおそらく誤ってそれらを打っています。この場合、ユーザは通常、代わりにjdk9 Java.util.concurrent.Flow APIを使用し、すべてのリアクティブストリームフレームワークは、今後予定されているjdk9互換バージョン内で互換/相互運用可能であるべきです。

編集:APIの廃止は主に上記の理由だけではないことにも言及する価値があります。一方で、実装の改善を示すために提起されたいくつかのバグレポート(上記リンク)のコメントで述べられているように、そのような従来のコードを維持することができない理由もあります。

88
Naman

はい、Java 9では推奨されていません。そして、もうオブザーバパターンを実装することはできません。


何故ですか?

もっと理由があります:

Not Serializable - 以来、ObservableはSerializableを実装していません。そのため、Observableもそのサブクラスもシリアライズできません。

No Thread Safety - メソッドはそのサブクラスによってオーバーライドされる可能性があり、イベント通知はさまざまな順序で、場合によってはさまざまなスレッドで発生する可能性があります。 ".

提供が少ない -

それらはアプリケーションのための十分に豊富なイベントモデルを提供しません。例えば、彼らは何かが変わったという概念だけを支持します、しかし彼らは何が変わったかについて少しの情報も伝えません

未解決の問題 - 前述したように、大きな問題が多数発生していました(スレッドの安全性、直列化可能)、そしてそれらのほとんどは修正が複雑で未だ "未修正"またはNo Active Development =、それがその理由です非推奨

私はまたこの答えを読むことをお勧めします なぜオブザーバパターンは廃止されるべきですか? 、@ Jeffは廃止予定の他の理由を説明しました。


だから、私たちが持っている代替手段は何ですか?

PropertyChangeEventおよびPropertyChangeListenerからJava.beansを使用できますパッケージ。

31
Ravi

なぜObserverはJava 9では推奨されないのですか?

Ans:ObservableクラスとObserverインターフェースは、ObserverObservableでサポートされるイベントモデルが非常に限られているため、通知の順序が制限されているため、Java 9では推奨されませんObservableによる配信は指定されておらず、状態の変化は通知と1対1で対応していません。

Javaのドキュメントを参照してください https://docs.Oracle.com/javase/9​​/docs/api/Java/util/Observable.html

オブザーバパターンの代替?

Observerのデザインパターンには多くの選択肢があり、Reactive Streamsもその1つです。

リアクティブストリームまたはフローAPI

FlowはJava 9で導入されたクラスで、4つの相互に関連するインタフェースがあります:ProcessorPublisherSubscriberおよびSubscription

Flow.Processor:購読者と発行者の両方として機能するコンポーネント。

Flow.Publisher:購読者が受け取った商品のプロデューサー。

Flow.Subscriber:メッセージの受信者.

Flow.SubscriptionFlow.PublisherFlow.Subscriberをリ​​ンクするメッセージコントロール。

Javaのドキュメントを参照してください https://docs.Oracle.com/javase/9​​/docs/api/Java/util/concurrent/Flow.html

9
Mohit Tyagi

ObservableクラスとObserverインターフェースは、Java 9以降では非推奨になったことを考慮してください。記事のとおり JavaのObserverとObservableはJDK 9では非推奨です

ObserverとObservableでサポートされているイベントモデルは非常に限られており、Observableによって配信される通知の順序は指定されておらず、状態の変化は通知と1対1で対応していません。より豊富なイベントモデルの場合は、Java.beansパッケージの使用を検討してください。スレッド間で信頼性が高く順序付けられたメッセージングを行うには、Java.util.concurrentパッケージの同時データ構造のいずれかを使用することを検討してください。リアクティブストリームスタイルのプログラミングについては、Flow APIを参照してください。

7
Aomine