我想为我所拥有的类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);
}
答案 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
,第二个测试有两个功能:
false
为y
,则返回null
- 这会减少代码量y
是否合适。修改强>
我不确定你的意见中的“复制”是什么意思,我认为你的意思是“参考”。如果你在将这些数组传递给equals
之前复制这些数组,我建议你不要这样做,因为如果这个对象进入Map
或者Set
,这个方法可以被调用许多次。 {{1}}。
答案 1 :(得分:0)
你最好做
if (!this.getClass().equals (y.getClass())) return false;
否则y
为null
时会出现NullPointerException。
没有。这仍然会引发NPE。应该是:
if (y == null || !this.getClass().equals (y.getClass())) return false;