本当に良い質問ですが、ここで少しの洞察があります。
CDI EG(専門家グループ)は、いくつかの理由のためにこれら二つを混合に対し決定:
- 下位互換性を
- 既存のアプリケーションは、同期を使用して、同じ注釈を維持等しく
- を動作するようになる必要がありますとにかく差別化のために余分なオプションを追加する必要があります
- 戻り値を呼び出す
- はあなたにこれが自然の非同期プログラミングモデルに適合
exceptionally()
またはthenApply()
などとすることができますチェーンの次のステップへCompletionStage
を与えます。唯一
- 古き良き
Event.fire()
あなたは全く反応できないためにどの、あなたにvoid
を与える - 非同期
- のためによくないと再度、同期1の戻り値は異なり取り扱い除きにより、下位互換性
- に変更することはできませんたくさん
- 例外チェーンの同期通知==最後に、あなたは非同期通知に
- 例外を爆破==あなたはオブザーバーメソッド(おそらく複数のスレッドから)からすべての例外を収集し続け、呼び出し元のコードにそれらを提示します。それは
CompletionStage
なので、簡単にそれに反応することができます。
- この2つを混ぜると、ユーザー側で非常に混乱する結果になります。いつ吹き飛ばし、いつ続けるのですか?
Event.fire()
の本当の成果は
- 内部オブザーバ処理
- (それは同様の非同期のためだったら)同期と非同期
を混合するために(それも可能だろうと仮定して)非常に複雑になるとは何ですか
- コンテキストが他のスレッドで伝播しないように、同期と非同期の間の線を厳密に描画する必要があることを覚えておいてください(例えば、
RequestScoped
をWeldが非同期オブザーバスレッドで再起動する必要があります)
- 同様の問題は、セキュリティコンテキストの伝播fまたはインテグレータ
- あなたはそれが
のために使用されるかを知ることはありませんようがあり、それは本当に速い動作させるために、多くの場合、オブザーバーの前処理であるあなたは、両方のための1つのオブザーバメソッドを持っている場合、あなたが本当に前処理、それすることができます私は考えることができる現行モデルの
その他の利点:fireAsync()
の
- プレゼンスは、追加オプション
- を提供しています - ユーザーエクスペリエンス を
- それはあなたが正確に
-
同じで、その作品は
fireAsync()
のためにあなたが
@ObservesAsync
に一致している前に持っていたものということは明らかである。この方法
これは非常に良い点です!私は確かに決定のより良い理解を持っています。ありがとうございました! – brandizzi