2013-03-05 104 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的方法,則可以將此方法調用很多次(許多次)。