0

equals()私が持っているクラスのカスタムメソッドを実装したいBoard. このメソッドは、 として定義された各ボードの配列を比較し、private int[] board配列が等しい場合は true を返し、そうでない場合は false を返します。等価性のテストにはいくつかの「落とし穴」があることを知っているので、等価性を真にテストするには、次のコードが最適で十分であるかどうか疑問に思っていました。

public boolean equals(Object y) {
    if (this.getClass() != y.getClass()) return false; //must be same class -- duh
    Board that = (Board) y; //y cast as Board
    int[] thisBoardCopy = this.getBoard(); //copy of current board
    int[] thatBoardCopy = that.getBoard(); //copy of y's board
    return Arrays.equals(thisBoardCopy, thatBoardCopy);
}
4

2 に答える 2

2

.equalsJava でメソッドを記述するための通常のイディオムは次のとおりです。

public boolean equals(Object y) {
    if(y == this) return true;
    if(!(y instanceof Board.class)) return false;
    final Board that = (Board) y; //y cast as Board
    return Arrays.equals(getBoard(), that.getBoard());
}

最初のテストは、同じ場合に高速化するだけでBoard、2 番目のテストには 2 つの機能があります。

  1. false次の場合yに戻りますnull- これにより、コードの量が少し減ります
  2. y正しいクラスのチェックを行います。

編集

コメントの「コピー」が何を意味するのかわかりませんが、「参照」を意味していると思います。これらの配列を に渡す前にコピーしてequalsいる場合は、このオブジェクトがMapまたはSet.

于 2013-03-05T17:25:41.143 に答える
0

やったほうがいい

if (!this.getClass().equals (y.getClass())) return false;

yそれ以外の場合は、の場合にNullPointerExceptionが発生しnullます。

いいえ。これでもNPEがスローされます。する必要があります:

if (y == null || !this.getClass().equals (y.getClass())) return false;
于 2013-03-05T17:19:51.883 に答える