27

Fooのようなインターフェースを実装するクラスがあるとしましょうMouseListener。インターフェイスは 5 つのMouseListenerメソッドで構成されていますが、そのうちの 1 つだけをオーバーライドしたいと考えています ( mouseClicked())。他の方法をフォーマットする標準的で慣用的な方法はありますか?

私の傾向は次のように書くことでした:

@Override
public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

@Override
public void mouseEntered(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseExited(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mousePressed(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseReleased(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

私は、メソッドが誤って空白のままになっているのではなく、意図的に空白になっていることを明示するのが好きですが、基本的に何もないために放棄されたすべての垂直方向のスペースに夢中になっているわけではありません。次の形式も見ました。

public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}

私は一般的にこれで問題ありませんし、作者の意図も理解していますが、(推奨)@Override注釈が追加されると非常に見苦しくなります。

私は特に経験豊富な Java コーダーではないので、慣習があるかどうか尋ねてみようと思いました。考え?

4

10 に答える 10

11

この特定のケースでは、wilums2 のアドバイスに従い、MouseListener を実装する代わりに MouseAdapter を拡張する必要があります。これらのアダプター クラスの目的は、インターフェイスのメソッドの一部のみを実装する場合に、空の実装を提供する必要がないようにすることです。

より一般的には、短い答えは「いいえ」です。空のメソッドを文書化する方法に関する標準的な規則はありませんが、私は通常、次のようなものを使用します

@Override
void foo() {
  // No implementation necessary
}
于 2009-05-19T18:29:37.153 に答える
9

1行に何も残らない場合は、あなたと同じ方法で行います。たぶん、「実装ワンライナー」の大きなブロックの上にコメントを入れてください。

于 2009-05-19T18:23:37.850 に答える
5

一般に、あなたが話しているのは Null Object Pattern の拡張です。Null オブジェクトを定義し、関心のあるメソッドのみをオーバーライドすることでそれを拡張しています。

これを自動化する方法の例として、私の JavaDude Bean Annotations ( http://code.google.com/p/javadude/wiki/Annotations ) では、次のようなことができます。[注: MouseAdapter は既に存在し、それをサブクラス化できるため、MouseListener に対してこれを行うことはお勧めしません...以下は、いくつかの選択メソッドのみを実装する他の大きなインターフェイスに役立ちます]

@Bean(nullObjectImplementations = @NullObject(type=MouseListener.class))
public class MyMouseHandler extends MyMouseHandlerGen {
    public void mouseClicked(MouseEvent e) {
        // your handling of a MouseClick
    }
}

その後、MyMouseHandler を使用してクリックを処理できます。=

注: MouseAdapter は、JRE/JDK のクラス名として非常に不適切な選択でしたこれは GoF アダプター パターンのインスタンスではありません。これは実際には、MouseListener の Null オブジェクトの実装です。

ところで: @Override をメソッド宣言と同じ行に置くことができます-あなたの例では、

@Override public void mousePressed(MouseEvent e) { /* not needed */ }
// et al
于 2009-05-20T14:00:22.540 に答える
5

MouseAdapter を使用する

于 2009-05-19T18:21:47.090 に答える
2

これを行うにはいくつかの方法があります。Oracle Java Conventions p6.4 (page 11) は、空のメソッドは次のように見えるべきだと述べています

public void empty() {}

2003年に書かれたSteve Yohananによるドキュメントもあります。

public void empty()
{
}

「インターフェーススタブとしての空のメソッド」の規則は見つかりませんでしたが。結論として、これを行う標準化された方法はありません。コメントを残すことを好む人もいれば、1行にすることを好む人もいれば、他のメソッドと同じように本文を空白で書く人もいます。

于 2014-01-10T11:59:37.710 に答える
0

この正確な質問を検索しているときにこれを見つけました。onScrollStateChangedが必要なが、onScrollは必要ないスクロールで使用しています。私はに傾いていました:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
            int totalItemCount) {
    return;         
} 

しかし、私はあなたが与える2番目の例が好きです(同じ行に中括弧を付けます)。コンパクトでクリーンで、意図的に空白にされているという考えを一貫して表現できます。

編集:これは私が決めたものです:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
            int totalItemCount) {return;}

これはたくさんのパラメータを持っているので、一行ほど見栄えは良くありませんが、あなたはその考えを理解します。

于 2012-08-25T14:06:26.160 に答える