EventBus
これは、グアバのクラスが克服できるメソッドのオーバーロードとインターフェースの制限に関係しています。
インターフェイスについては、次のシナリオを検討してください。
複数の形式の入力に対して呼び出される同じコードがあります。たとえば、マウス イベント、キー イベント、およびフォーカス イベントをリッスンするリスナーですが、すべてのメソッドは同じことを行います: ソースを再描画します。これは、私のコードが次のようになることを意味します。
public class BunchOfListeners implements MouseListener, KeyListener, FocusListener {
@Override
public void focusGained(FocusEvent e) {
doSomething(e);
}
@Override
public void focusLost(FocusEvent e) {
doSomething(e);
}
@Override
public void keyTyped(KeyEvent e) {
doSomething(e);
}
@Override
public void keyPressed(KeyEvent e) {
doSomething(e);
}
@Override
public void keyReleased(KeyEvent e) {
doSomething(e);
}
@Override
public void mouseClicked(MouseEvent e) {
doSomething(e);
}
@Override
public void mousePressed(MouseEvent e) {
doSomething(e);
}
@Override
public void mouseReleased(MouseEvent e) {
doSomething(e);
}
@Override
public void mouseEntered(MouseEvent e) {
doSomething(e);
}
@Override
public void mouseExited(MouseEvent e) {
doSomething(e);
}
public void doSomething(EventObject e) {
((Component) e.getSource()).repaint();
}
}
これがどれほど醜いことに気づきますか?これには 10 の異なる方法がありますが、最終的には、イベントからソースを取得することだけが重要です (EventObject
ちなみに、これが で指定されているため、例でそれを使用しました) repaint
。
Guava のを使用EventBus
すると、これは非常に簡単になります。クラスで必要なのは 1 つのメソッドだけです。GuavaIsAwesome
ComponentRepainter
public class ComponentRepainter {
@Subscribe
public void doSomething(EventObject e) {
((Component) e.getSource()).repaint();
}
}
これを に登録し、EventBus
後で発火すると、次のようMouseEvent
になります。
EventBus eventBus = ... ;
eventBus.register(new ComponentRepainter());
以降:
MouseEvent e = ... ;
eventBus.post(e);
doSomething
これにより、メソッドが呼び出されます。これは、パラメーターの を持つメソッドだけでなく、から割り当て可能なパラメーターを持つすべてのメソッドにもイベントComponentRepainter
が発生するためです。つまり、extendsであるため、Guavaはそれを受け入れるものすべてに渡します。acceptを作成すると、 に投稿されたすべてのイベントを取得でき、一種のグローバル リスナーになります ( Java ではすべてが を拡張するため)。@Subscribe
MouseEvent
MouseEvent
MouseEvent
EventObject
EventBus
EventObject
doSomething
Object
EventBus
Object
同じことがインターフェースにも当てはまります。EventBus
何らかのインターフェースの具体的な実装を渡すと、@Subscribe
(具体的な型ではなく) そのインターフェースを使用するメソッドが呼び出されます。それははるかに柔軟で、「10 の役に立たない方法」アプローチを克服します。