Почему я не могу использовать 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
Другие вопросы по тегам