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

.equals在 java 中编写方法的惯用语是这样的:

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. 它返回falseif yis null- 这会稍微减少代码量
  2. 它会检查您是否y属于正确的类别。

编辑

我不确定您在评论中所说的“复制”是什么意思,我假设您的意思是“参考”。如果您在将这些数组传递给之前复制这些数组,我建议您不要这样做,因为如果该对象找到进入 a或equals的方式,则可以多次调用此方法。MapSet

于 2013-03-05T17:25:41.143 回答
0

你最好这样做

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

否则会出现 NullPointerException in case yis null

不,这仍然会引发 NPE。应该:

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