Реализация в ответ by andersoj
return left != null && right != null && left.equals(p.left) && right.equals(p.right);
неверно: нулевые тесты ясно показывают, что нулевое значение является допустимым значением для левых и правых. Таким образом, есть как минимум две проблемы:
new Pair(null, null).hashCode()
бросков NPE
new Pair(null, null)
НЕ равно себе!
Посмотрите на Объекты класса Guava для правильной реализации. Используйте его или напишите статические вспомогательные методы, такие как
public static boolean equal(Object a, Object b) {
return a==b || a!=null && a.equals(b);
}
public static int hashCode(Object a) {
return a==null ? 0 : a.hashCode();
}
и всегда используйте их.
Никогда не пишите equals
, содержащий нулевой тест.
Это легко взорвать, и никто не заметил этого. Используя Помощника, легко понять это правильно:
public boolean equals(Object o) {
if (!(o instanceof Pair)) return false;
Pair p = (Pair) o;
return Helper.equals(left, p.left) && Helper.equals(right, p.right);
}
public int hashCode() {
return 7 * Helper.hashCode(left) + 13 * Helper.hashCode(right);
}
Конечно, запрещение нулей в конструкторе тоже возможно.