Общий вопрос: при реализации переопределения метода по умолчанию equals
в Java, что должно быть связано с простое использование уже реализованного метода compareTo
против записи независимой логики в метод equals? Я заметил, что кто-то упомянул в другом вопросе, что foo.equals((String)null)
возвращает false, тогда как String.compareTo((String)null)
выбрасывает NullPointerException
. Что делает эти несогласованные результаты идеальной функциональностью?
Пример equals
:
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof MyClass) {
MyClass msg = (MyClass)obj;
return this.compareTo(msg) == 0;
}
return false;
}
Edit: Цитата из документации по Comparable
Естественное упорядочение для класса C называется согласованным с равен тогда и только тогда, когда e1.compareTo(e2) == 0 имеет такое же логическое значение как e1.equals(e2) для всех e1 и e2 класса C. Обратите внимание, что null не является экземпляр любого класса, а e.compareTo(null) должен NullPointerException, хотя e.equals(null) возвращает false
Edit:
После дальнейшего обзора я нахожу, что в документации Comparable также указано следующее:
Разработчик должен обеспечить sgn (x.compareTo(y)) == -sgn (y.compareTo(x)) для всех x и y. (Это означает, что x.compareTo(y) должен генерировать исключение iff y.compareTo(x) создает исключение.)
Ergo, так как null.compareTo(x)
явно бросает NPE, x.compareTo(null)
должен также бросать NPE. В то время как для равных, это не обязательно так. Я достаточно разбираюсь в правильном обращении с NPE, поэтому считаю это относительно значительным.