Почему я не могу использовать toString(). Length() в качестве возврата hashCode()?
public class Dog
{
int collarID;
String name;
public static void main(String[] args){
Dog d = new Dog();
d.name="hose";
System.out.print(d.hashCode());
}
public boolean equals(Object arg0)
{
if (arg0 instanceof Dog)
{
Dog new_name = (Dog) arg0;
return collarID==new_name.collarID && new_name.name.equals(name);
}
return false;
}
public int hashCode()
{
return toString().length();//Stackru
}
}
Что мне не хватает? Есть ли повторяющийся вызов метода hashCode() из-за метода toString() по умолчанию?
1 ответ
Если вы видите исходный код toString
метод Object
класс, это выглядит так:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Итак, это внутренне вызывает hashCode()
метод. Теперь, так как вы переопределили hashCode
метод, он будет вызывать hashCode
метод вашего класса, который вызывает toString
метод Object
учебный класс.
Это, безусловно, приведет к StackOverFlowError
Вы можете скорее переопределить toString
метод в вашем классе, чтобы он работал.
PS: -
Тем не менее, ваш hashCode
реализация должна быть разработана с учетом атрибутов, которые вы использовали в equals
метод, чтобы сохранить contract
между hashCode
а также equals
метод. Используйте только те attributes
в расчете hashCode
что вы использовали для сравнения ваших instances
в equals
метод.
Смотрите эти ссылки для более подробной информации о hashCode
а также equals
Метод: -
Effective Java - Item # 8 - Obey the general contract when overriding equals
Effective Java - Item # 9 - Always override hashCode when you override equals