2011-08-29 10 views
4

インターフェイスとイベントを使用してUIコードをデカップリングしようとしていますが、イベントを宣言するための方法やベストプラクティスがあるかどうかを知りたいと思いますJavaインタフェースの - C#が提供するもののようなもの:ベストプラクティス - Javaインターフェイスの一部としてイベントを宣言する

// C# event declaration in interface 
public interface IAction 
{ 
    event EventHandler OnAction; 
} 

私の目標は、それはそれ(実装)が知られているように、インターフェイスをマークするだけで、特定のタイプのイベントを発生させます。私は、その動作を強制するためだけのドキュメンテーション以上を含めることができると期待しています。私は、Javaが "イベント"キーワードやこれを行う直接的な方法を提供していないことを認識しているので、これを達成するための回避策やベストプラクティスに関する助言を期待しています。

public interface FiresEvent<T extends Event> { 
    public void fireEvent(); 
} 

...そして私のカスタムインターフェイスでそのインターフェイスを継承する:私はこれを行うと考えることができ

一つの方法は、イベントを発生する機能を表し、一般的なマーカーインターフェイスを作成することです。

public interface MyInterface extends FiresEvent<ActionEvent> { 

} 

このアプローチの問題は、「FiresEventは」だけでも、一般的なタイプが変化した場合、一度継承することができ、その解決策は、オブジェクトが複数の源となり得る場合のための十分な汎用的ないないようだということですイベント。

私は、人々がこれをどのように処理するのか、またイベントを発生させる必要性を文書化するよりも良い方法があるのか​​どうか不思議です。

EDIT: たぶん、次は私の質問をクリアします:

私は、発信者がオブジェクトに対するハンドラを登録できるようにすることで、Javaのハンドラリストのアプローチと自己取り扱いを理解しています。私の場合、私はイベントバスに頼っているので、イベントを「放火」イベントと見なして、ハンドラにリダイレクトすることができます。

私は、インターフェイスの責任を定義したい:インタフェースの実装者が何

  • /世界/イベントバスに型Tのイベントを発生

    • インタフェースの実装者がに委任する必要はありません。登録されたリスナー自身
  • 答えて

    4

    Javaでは、以前とは少し違ったイベントが処理されますが、概念は同じです。イベントリスナーと呼ばれるものを作成し、イベントが発生したときに呼び出されます。これは、複数のリスナーを登録することができるため、より優れた構成にすることができます。私はインターフェイスでこのtutorial

    +0

    私はJavaイベントに慣れています。私の質問は、インターフェイスがイベントをスローするように指定する際のベストプラクティスについてです。 –

    +0

    これはどういう意味ですか? http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/beans/java/beans/PropertyChangeListener.java.htm – Preston

    +0

    Javaはイベントを発生させず、登録済みのリスナーを呼び出します。したがって、C#モデルを模倣したい場合は、登録済みのリスナーを呼び出す必要があります。 – Preston

    2

    方法の存在

    registerXListener(XListener listener) 
    

    を閲覧示唆

    は、クラスがその介護者にXEventsを発送させていただきますことを示しています。つまり、 'マーカー'は単なる別の方法です。 (と思う)C#のイディオムの最寄りのアナログは、これは注釈を使用するための自然な場所のように思える

    public interface XEventFirer 
    { 
        public void registerXListener(XListener listener) 
    } 
    
    2

    のように、インターフェイスにその方法を持ち上げることであろう。私はEventBusを見てきました。これは、イベントのパブリッシュとサブスクライブにアノテーションを使用しています。このアプローチは当然自己文書化であり、実装方法に応じてコードを読みやすくしたり、アノテーションを強制することができます。

    +1

    別のライブラリ(これはEventBusよりもこの種の事柄に対して型の安全です)はGUTSイベントです - http://kenai.com/projects/guts/pages/Home –

    +0

    @Kevinそれは良い情報です...私はGuiceを読んだことはない。そのパッケージのようなサウンドは、OPが望んでいるもののほとんどを行いますが、少なくともクラスレベルでは、イベント消火器をマーキングするのが本当に良いようには見えません。私が混乱したら私を助けてください。 –

    +0

    あなたは正しいです - それは消火器をマーキングするための設備を持っていません...正直なところ、私はそのようなことをやっていることをよく理解していません - あなたがイベントバスを使用している場合、イベントがどこから来るのか心配です。私はこれらの余分な非機能アノテーションの必要性を本当に理解したことはありませんでしたが、それはおそらく私のところでは想像力の欠如です。注釈を使用して* consumer *に印を付けることは、DIフレームワークがメッセージを配信することを可能にし、多くの定型文を減らすために意味があります。 –

    関連する問題