2013-05-10 2 views
2

Мое назначение - переопределить метод equals(). У меня есть несколько проблем с использованием Stack12<E> that = (Stack12<E>)o; и o instanceof Stack12. Я удивляюсь, что они плохие практики, особенно, как я использую that в for-loop чувствует себя немного не так, как надо.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

+2

Единственное предостережение, которое я добавил бы, заключается в том, что всякий раз, когда вы переопределяете 'equals (...)', вы также захотите переопределить 'hashCode()'. Ой, я действительно вижу одну важную проблему - ответ отправлен. –

ответ

5

Один нюанс я хотел бы добавить, что всякий раз, когда вы переопределить equals(...), вы также хотите, чтобы переопределить hashCode(). Я согласен с тем, что просмотр instanceof overused заставляет меня беспокоиться о запахе кода, но я думаю, что у вас нет другого выбора, кроме как использовать instanceof в этой ситуации. Что касается приведения к родовому типу, я могу ошибаться, но во время выполнения дженерики действительно не существуют, поэтому он может быть спорным.

Одна потенциальная проблема, которую я вижу, заключается в том, что вы используете == в своем цикле for. Если ваш массив стека использует объекты, вы должны использовать equals(...) внутри цикла. Тот факт, что ваш класс является общим, предполагает, что массив стека содержит объекты, но я не уверен, так как мы этого не видим.

+0

Благодарим вас за равенство (...) tip – Sugihara

+0

@Jack: Пожалуйста, обратите внимание, что это не проблема, если стек содержит примитивы. –

+0

O == null не нужно. instanceof всегда будет false для null. – user949300