2013-03-05 100 views
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); 
} 
+3

您在开始时忘记了空检查。如果y为null,则会中断 – cowls 2013-03-05 17:19:03

回答

0

您做的更好

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

否则会在ynull的情况下为NullPointerException。

不,这仍然会导致NPE。应该是:

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

使用'instanceof'运算符 - 如果比较符为'null',则返回false if(!(Y instanceof MyClass.class))返回false;' – 2013-03-05 17:22:39

+1

@ bmorris591'instanceof' has different意义和速度较慢,但​​在很多情况下'instanceof'更好。 – 2013-03-05 17:23:46

+0

@MikhailVladimirov请纠正你的答案,即使编辑后的第一部分是完全错误的。 – entonio 2013-03-05 17:29:39

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. 它返回false如果ynull - 这减少了代码量的位
  2. 这是你的支票,y是正确的类。

编辑

我不知道你在你的意见“复制”的意思,我想你的意思是“参考”。如果您在将这些数组传递给equals之前复制这些数组,我建议您不要这样做,因为如果此对象找到MapSet的方法,则可以将此方法调用很多次(许多次)。