オブザーバーはJava 9で非推奨になりました。代わりに何を使用する必要がありますか?


回答:


104

何故ですか?オブザーバーパターンを実装する必要がないということですか?

最初に後半に答える-

YES、それはあなたが実装するべきではありませんどういう意味ObserverObervableもうね。

なぜ彼らは廃止されました -

アプリケーションに十分な機能を備えたイベントモデルを提供していませんでした。たとえば、何かが変更されたという概念だけをサポートすることができましたが、何が変更されたかについての情報を伝えることはできませんでした。

アレックスの答えはそれをObserver弱くするObservableことをうまく前に置いています:すべてのは同じです。instanceofオブジェクトに基づくロジックを実装し、オブジェクトを具象型にObservable.update()メソッドにキャストする必要があります。

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

その代わりのより良いものは何ですか?

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

それ以外の部分については@Deprecation、他の回答にもリンクされている他のパッケージを探索するための適切なドキュメントが付いています。


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

最近、これらに遭遇した人は、おそらく、RxJavaまたは他のリアクティブストリームフレームワークを使用しているときに、誤ってそれらにヒットしています。その場合、ユーザーは通常、代わりにjdk9 java.util.concurrent.FlowAPIを使用することを望み ます。これは、すべてのリアクティブストリームフレームワークが、今後予定されているjdk9互換バージョン内で互換性/相互運用可能でなければならないということです。

編集:APIの非推奨は主に上記の理由だけではなく、いくつかのバグレポート(上記にリンク)のコメントで言及されているようなレガシーコードを維持できないことにも言及する価値があります。何らかの方法でその実装の改善をマークします。


3
+1。良い答えですが、私はまだそれを理解しようとしています。Javaのオブザーバーは、デザインパターン自体の固有の問題(GOFの本で定義されている)またはJavaによるパターンのサポートの問題のために非推奨になっていますか?C#、C ++、Pythonなどの他のオブジェクト指向言語では、オブザーバーデザインパターンにもJavaと同じ問題がありますか?
Tim

25
特定の実装が廃止されたという事実は、Observer パターンに致命的な欠陥があることを意味するものではありません。Listenerオブザーバーでもあります。
chrylis -cautiouslyoptimistic- 2017

@chrylisおかげで、これ以上同意できませんでした。APIを非推奨にする主な理由の1つは、それに付随するメンテナンスであり、その実装を変更すると他のコードが壊れる可能性があることです。
ナマン2017

@ curious95 そこに同時通知する方法を理解することができません。
ナマン2017

4
@ curious95はい、notifyObservers()同時呼び出しです。以下は、同じ機能のコードレットで、その機能を詳細に説明しています。
ナマン2017

37

はい、Java 9では非推奨です。また、オブザーバーパターンを実装できなくなりました。


何故ですか?

さらに理由があります:

シリアル化不可 -以来、ObservableはSerializableを実装していません。したがって、Observableとそのサブクラスをシリアル化することはできません。

スレッドセーフなし -メソッドはそのサブクラスによってオーバーライドでき、イベント通知はさまざまな順序で、場合によってはさまざまなスレッドで発生する可能性があり、「スレッドセーフティ」を混乱させるのに十分です。

あまり提供しない -

これらは、アプリケーションに十分な機能を備えたイベントモデルを提供していません。たとえば、何かが変更されたという概念のみをサポートしますが、何が変更されたかについての情報を伝えません。

未解決の問題 -言及したように、発生した多くの主要な問題(スレッドセーフティ、シリアル化可能)があり、それらのほとんどは修正が複雑で、まだ「修正されていない」か、アクティブな開発がありませんでした。そのため、この問題は非推奨になりました

また、この回答を読むことをお勧めします、@ Jeffは非推奨のその他の理由を説明しています。


それで、私たちが持っている代替案は何ですか?

あなたは使用することができるPropertyChangeEventPropertyChangeListenerjava.beansパッケージ。


PropertyChangeListenerを置き換えますがObserver、代わりに何を拡張/実装する必要がありObservableますか?
LastStar007 2018

更新:私はアプローチをPropertyChangeSupportインスタンス変数として追加することだと思いますが、確認をお願いします。
LastStar007 2018

3
@ LastStar007私はあなたが正しいと思います。Baeldung.comでそれを行うコードサンプルを見つけました。
Dragos Stanciu

13

ObserverがJava 9で廃止されたのはなぜですか?

回答:ObservableクラスとObserverイベントモデルがでサポートされているので、インターフェースは、Java 9で廃止されているObserverObservable、非常に限られている、で配信通知の順序が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.PublisherとをリンクするメッセージコントロールFlow.Subscriber

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


7

Java 9以降、ObservableクラスとObserverインターフェースが廃止されたことを考慮してください。投稿のとおり、JavaのObserverとObservableはJDK 9で廃止されました

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.