Java 9が登場し、 Observer
は非推奨になりました。何故ですか?オブザーバパターンをもう実装すべきではないということですか。
より良い代替手段が何かを知っておくとよいでしょうか。
どうしてですか?オブザーバパターンをもう実装すべきではないということですか?
後半に最初に答える -
YES、Observer
とObervable
sをもう実装しないでください。
彼らはアプリケーションのための十分に豊富なイベントモデルを提供しませんでした。例えば、彼らは何かが変わったという概念だけを支持することができましたが、何が変わったかについての情報を伝えませんでした。
Alexの答えObserver
には弱点があるということを前もって明確に示しています。すべてのObservable
sは同じです。 instanceof
に基づいたロジックを実装し、オブジェクトをObservable.update()
メソッドに具象型にキャストする必要があります。
それを追加するために、1つのようなバグがありました Observable
をシリアル化できませんでした クラスはSerializable
インターフェースを実装していなかったのでそのメンバーはすべてプライベートだったので。
それに代わるより良い方法は何ですか?
一方Listeners
にはたくさんの型があり、それらにはコールバックメソッドがあり、キャストは必要ありません。 answer で@Raviが指摘しているように、代わりに PropertyChangeListener
を利用することができます。
それ以外の部分では、@Deprecation
は他の回答にもリンクされている他のパッケージを探索するための適切な文書でマークされています。
非推奨も このメール - に記載されているように分析でマークされていることに注意してください。
最近では、
RxJava
やその他のリアクティブストリームフレームワークを使用しているときに、これらに遭遇した誰かがおそらく誤ってそれらを打っています。この場合、ユーザは通常、代わりにjdk9Java.util.concurrent.Flow
APIを使用し、すべてのリアクティブストリームフレームワークは、今後予定されているjdk9互換バージョン内で互換/相互運用可能であるべきです。
編集:APIの廃止は主に上記の理由だけではないことにも言及する価値があります。一方で、実装の改善を示すために提起されたいくつかのバグレポート(上記リンク)のコメントで述べられているように、そのような従来のコードを維持することができない理由もあります。
はい、Java 9では推奨されていません。そして、もうオブザーバパターンを実装することはできません。
もっと理由があります:
Not Serializable - 以来、ObservableはSerializableを実装していません。そのため、Observableもそのサブクラスもシリアライズできません。
No Thread Safety - メソッドはそのサブクラスによってオーバーライドされる可能性があり、イベント通知はさまざまな順序で、場合によってはさまざまなスレッドで発生する可能性があります。 ".
提供が少ない -
それらはアプリケーションのための十分に豊富なイベントモデルを提供しません。例えば、彼らは何かが変わったという概念だけを支持します、しかし彼らは何が変わったかについて少しの情報も伝えません
未解決の問題 - 前述したように、大きな問題が多数発生していました(スレッドの安全性、直列化可能)、そしてそれらのほとんどは修正が複雑で未だ "未修正"またはNo Active Development =、それがその理由です非推奨。
私はまたこの答えを読むことをお勧めします なぜオブザーバパターンは廃止されるべきですか? 、@ Jeffは廃止予定の他の理由を説明しました。
PropertyChangeEvent
およびPropertyChangeListener
からJava.beans
を使用できますパッケージ。
なぜObserverはJava 9では推奨されないのですか?
Ans:Observable
クラスとObserver
インターフェースは、Observer
とObservable
でサポートされるイベントモデルが非常に限られているため、通知の順序が制限されているため、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つの相互に関連するインタフェースがあります:Processor
、Publisher
、Subscriber
およびSubscription
。
Flow.Processor
:購読者と発行者の両方として機能するコンポーネント。
Flow.Publisher
:購読者が受け取った商品のプロデューサー。
Flow.Subscriber
:メッセージの受信者.
Flow.Subscription
:Flow.Publisher
とFlow.Subscriber
をリンクするメッセージコントロール。
Javaのドキュメントを参照してください https://docs.Oracle.com/javase/9/docs/api/Java/util/concurrent/Flow.html
Observable
クラスとObserver
インターフェースは、Java 9以降では非推奨になったことを考慮してください。記事のとおり JavaのObserverとObservableはJDK 9では非推奨です
ObserverとObservableでサポートされているイベントモデルは非常に限られており、Observableによって配信される通知の順序は指定されておらず、状態の変化は通知と1対1で対応していません。より豊富なイベントモデルの場合は、
Java.beans
パッケージの使用を検討してください。スレッド間で信頼性が高く順序付けられたメッセージングを行うには、Java.util.concurrent
パッケージの同時データ構造のいずれかを使用することを検討してください。リアクティブストリームスタイルのプログラミングについては、Flow APIを参照してください。