20

私は C# の世界から Java に来ています。そこでは Observer パターンがeventキーワードを使用したファーストクラスの言語構造として実装されています。

Java にObservableは初期の頃からこのクラスがあったようですが、明らかに実装上の問題があり、広く使用されていないようです。これまでのところ、私は自分の Java コードでオブザーバー パターンの独自の実装を進めてきましたが、常にこのボイラープレート コードを生成するよりも優れた代替手段があるに違いないと常に考えずにはいられません。Swing には Listener クラスがありますが、Swing 以外のコードには適していないようです。

この非常に一般的な問題の推奨される解決策は何ですか? サードパーティのライブラリは私には問題ありません。

4

3 に答える 3

18

通常、オブザーバー パターンは、必要に応じてアドホック ソリューションで実装されます。行動パターンに関して言えば、これは最も単純なものの 1 つです。「オブザーバー」のリストを制御する 2 つのメソッドと、興味深いことが起こったときにオブザーバーに通知する 1 つのメソッドです。

オブザーバー パターンは、特定のドメインの外ではほとんど発生しない傾向があり、発生した場合でも、アプリケーション ドメインに限定されすぎる傾向があるため、一般的なソリューションはほとんど価値がありません。java.util.Observableクラスの問題を見ることができます: から継承Observableする場合、渡される可能性のあるすべての種類の「オブザーバー」を受け入れる必要があります。これは、アプリケーションにとって意味がない可能性があります。

  • オブジェクトが 2 種類のイベントを生成できるため、オブザーバーの 2 つの異なるリストが必要な場合はどうでしょうか?
  • オブザーバーがイベントに応じてオブジェクトに影響を与える可能性がある場合 (変更を拒否できるなど) はどうでしょうか?

とはいえ、Google Guava の EventBus は、根本的に異なるアプローチを採用することで、イベントの生成と処理を単純化するという点でかなりうまく機能しているようです。

注釈に基づく他の手法は、SOで以前に説明されています。

于 2012-04-18T22:32:01.003 に答える
7

リアクティブ プログラミングを調べることをお勧めします。Java には、私が知っている唯一の実装があります: react4javaです。

于 2012-09-17T13:59:06.247 に答える
4

この記事では、Spring Framework を使用したパターンの優れた実装を示します。Subject および Observer インターフェース (および実装) を定義する必要がありますが、Spring は XML 構成を介して Subject への Observer 登録を処理します。

于 2012-04-18T22:30:54.780 に答える