Java:Проверять hashCode только в equals()неизменяемого объекта

У меня есть неизменяемый объект, например узел в декартовом пространстве. Класс неизменяем, поэтому я кэширую hashCodeдля очень быстрого хеширования.

private final int hashCode;

private final double x, y, z;

public Node(final double x, final double y, final double z)
{
    this.x = x;
    this.y = y;
    this.z = z;
    this.hashCode = Objects.hashCode(this.x, this.y, this.z);
}

@Override
public boolean equals(final Object obj)
{
    if (this == obj) { return true; }
    if (obj == null) { return false; }
    if (!(obj instanceof Node)) { return false; }
    final Node other = (Node) obj;
    return Objects.equal(this.x, other.x) && Objects.equal(this.y, other.y) && Objects.equal(this.z, other.z);
}

@Override
public int hashCode()
{
    return this.hashCode;
}

Поскольку hashCodeуникален и зависит от всех полей класса И класс является неизменяемым, было бы правильно проверять равенство Nodeтолько на основе hashCode?

@Override
public boolean equals(final Object obj)
{
    if (this == obj) { return true; }
    if (obj == null) { return false; }
    if (!(obj instanceof Node)) { return false; }
    final Node other = (Node) obj;
    return this.hashCode == other.hashCode;
}

Это проходит все модульные тесты, которые я написал о свойствах equals()и hashCode()и их взаимодействии, но, возможно, я что-то упускаю?

Примечание:Objects.hashCode()и Objects.equal()являются классами Guava, полезными для соответствующих методов.

7
задан c00kiemon5ter 18 April 2012 в 00:44
поделиться