2013-05-10 95 views
2

我的任務是重寫方法equals()。我有幾個使用Stack12<E> that = (Stack12<E>)o;o instanceof Stack12的問題。我很奇怪他們是不好的練習,特別是我在for循環中使用that對我來說有點不合適。Java將此類與該類進行比較以獲得相等

是否有另一種方法比較此類與其他對象?或者我的比較方法足夠強大?

public boolean equals(java.lang.Object o){ 
    if(o == this) return true; 
    if(o == null || !(o instanceof Stack12)){ 
    return false; 
    } 

    Stack12<E> that = (Stack12<E>)o; 
    if(this.size != that.size || this.capacity != that.capacity){ 
    return false; 
    } 
    for(int i = 0; i < this.size; i++){ 
    if(that.stack[i] != this.stack[i]){ 
     return false; 
    } 
    } 
    return true; 
} 
+0

我感到不舒服將對象轉換爲泛型類型。而且我認爲我在某處閱讀使用instanceof是Java中的一個不好的練習。 – Sugihara 2013-05-10 03:08:18

+2

我唯一需要注意的是,只要你重寫'equals(...)',你也會想重載'hashCode()'。哎呀,我確實看到一個主要問題 - 答案已發佈。 – 2013-05-10 03:08:25

回答

5

一個警告我想補充的是,每當你重寫equals(...),您還需要重寫hashCode()。我同意看到過度使用instanceof讓我擔心代碼異味,但我認爲你別無選擇,只能在這種情況下使用instanceof。至於轉換爲泛型類型,我可能是錯的,但在運行時,泛型真的不存在,所以它可能是沒有意義的。

我看到的一個潛在的主要問題是您在for循環中使用==。如果您的堆棧數組使用對象,則應在循環內部使用equals(...)。你的類是泛型的這一事實表明棧數組確實包含對象,但我不確定,因爲我們沒有看到這個。

+0

謝謝你的平等(...)提示 – Sugihara 2013-05-10 03:12:44

+0

@傑克:不客氣,但請注意,這是不是一個問題,如果堆棧持有原語。 – 2013-05-10 03:13:07

+0

o == null是不必要的。對於null,instanceof將始終爲false。 – user949300 2013-05-10 04:09:05