2010-09-12 4 views
3

мне нужно написать метод Equals() для класса команд, который соответствует предоставленному методу HashcodeEquals() метод помощи

метод HashCode

public int hashCode() 
    { 
     return this.getPro().hashCode() 
      + this.getTeam().hashCode(); 
    } 

Мой равно метод, но не будет работать

public boolean equals(Object obj) 
    { 
    ClassName pro = (ClassName) obj; 
    return (this.getPro().hashCode() == pro.getPro()); 
      (this.getTeam().hashCode() == pro.getTeam()); 
    } 

Любая помощь будет хорошо

+1

Вы сравниваете hashCodes с объектами. Это не сработает. Что вы пытаетесь достичь? Как вы думаете, hashCode()? –

+0

Если вы собираетесь помещать объекты в HashSet или HashMap, то два одинаковых объекта должны возвращать один и тот же хэш-код, а два объекта, которые возвращают разные хэш-коды, не должны быть равны.Два неравных объекта могут возвращать один и тот же хэш-код (существует 4 миллиарда возможных хэш-кодов, но, возможно, еще много возможных строк). Вы не можете определить equals() в терминах hashCode(); он может сказать, что два неравных объекта равны. –

ответ

2
  1. Хэш двух объектов равный не означает два объекта равны.
  2. Чтобы проверить, удовлетворены ли оба условия, используйте &&.

Таким образом,

public boolean equals(Object obj) 
    { 
    ClassName pro = (ClassName) obj; 
    return this.getPro() == pro.getPro() && this.getTeam() == pro.getTeam(); 
    } 

Тем не менее, ваш hashCode() не будет генерировать хороший гашиш, и equals() потерпит неудачу во многих случаях (например, по сравнению с непостоянным ClassName или null). См. Overriding equals and hashCode in Java, как правильно их реализовать. Предполагая, что нет производного класса, попробуйте

@Override public boolean equals(Object obj) { 
    if (obj == this) return true; 
    if (!(obj instanceof ClassName)) return false; 
    ClassName pro = (ClassName)obj; 
    <sometype> thisPro = getPro(); 
    if (thisPro == null || !thisPro.equals(pro.getPro()) return false; 
    <sometype> thisTeam = getTeam(); 
    if (thisTeam == null || !thisTeam.equals(pro.getTeam()) return false; 
    return true; 
} 
+2

Я бы не использовал '==' для сравнения объектов в методе 'equals()'. В большинстве случаев (если не всегда), если содержание объектов равно, то сами объекты равны. –

+0

Условие (obj == null) является избыточным: (null instanceof ClassName) == false – meriton

+0

@Colin: Я предположил, что '==' сравнивает значения вместо ссылок. Исправлена. – kennytm

3

Здесь вы сравниваете хэш-код (int) с объектом. Кроме того, в середине вашего заявления есть точка с запятой.

Вы должны попробовать это вместо:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MyClass myClass = (MyClass) o; 

    if (!pro.equals(myClass.pro)) return false; 
    if (!team.equals(myClass.team)) return false; 

    return true; 
} 

Здесь вы сравнить содержимое объектов.


После @Bart К. комментарий здесь есть способ, чтобы написать свой equals() метод, если команда или про являются обнуляемым:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MyClass myClass = (MyClass) o; 

    if (pro != null ? !pro.equals(myClass.pro) : myClass.pro != null) return false; 
    if (team != null ? !team.equals(myClass.team) : myClass.team != null) return false; 

    return true; 
} 

Ресурсы:

На эту же тему:

+0

'equals (...)' также следует проверить на 'obj == null'. –

+0

Это зависит от того, являются ли про и команда нулевыми или нет. И поскольку они не кажутся нулевыми (см. OP 'hashCode()'), это действительно не нужно. –

+0

Нет, я не имел в виду 'pro' или' team' значение null, но 'obj'. Например, 'ArrayList ' может содержать ссылки «null», и если вы используете 'contains (instanceOfClassName)' на нем, ваша реализация будет бросать NPE при сравнении «null» с 'this'. –

Смежные вопросы