测试平等的充分方法

时间:2013-03-05 17:17:52

标签: java

我想为我所拥有的类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);
}

2 个答案:

答案 0 :(得分:2)

在java中编写.equals方法的常用习惯是:

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,第二个测试有两个功能:

  1. 如果falsey,则返回null - 这会减少代码量
  2. 检查y是否合适。
  3. 修改

    我不确定你的意见中的“复制”是什么意思,我认为你的意思是“参考”。如果你在将这些数组传递给equals之前复制这些数组,我建议你不要这样做,因为如果这个对象进入Map或者Set,这个方法可以被调用许多次。 {{1}}。

答案 1 :(得分:0)

你最好做

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

否则ynull时会出现NullPointerException。

没有。这仍然会引发NPE。应该是:

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