2015-12-28 3 views
14

Я пытаюсь создать класс кортежа, который позволяет кортежную структуру на Java. Общий тип для двух элементов в кортежах - это X и Y соответственно. Я пытаюсь переопределить правильные значения для этого класса.Objects.equals и Object.equals

Thing is, Я знаю, что Object.equals попадает в дефолт, который по-прежнему сравнивается на основе ссылок типа «==», поэтому я не уверен, что смогу это использовать. Я посмотрел на Объекты, и в нем есть equals(). До сих пор ли он сравнивается по ссылкам или сравнивается с содержанием?

Быстро представить возвратную заявление как что-то вроде:

return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next); 

где предыдущая и следующая элементы кортежа. Будет ли это работать?

+2

Вы можете прочитать исходный код для встроенных классов JRE. – chrylis

ответ

27

Разница заключается в том, что Objects.equals() считает два нуля равными. Псевдокод является:

  1. , если оба параметра null возврата true
  2. , если ровно один параметр null возврата false
  3. возвращает результат вызова equals() метода первого параметра передавая ему второй параметр

Это поведение означает, что оно является «нулевым».

+0

Точка 2 задокументирована неправильно. Код: 'return (a == b) || (a! = null && a.equals (b)); 'поэтому он на самом деле есть *, если ** first ** параметр' null' return 'false' *. Если второй - «null», ваш 'equals' вызывается с параметром« null ». Что может представлять интерес, если вы внедрили свой 'equals' неправильно, в зависимости от' Objects.equals' один нуль слишком далеко, как и я. –

0

Objects.equals просто вызывает его первый аргумент метод .equals. В java, если вы хотите проверить на равенство в экземплярах класса, который вы сделали, вам придется переопределить метод equals. instance.equals() использует только ==, если тип экземпляров не переопределяет метод equals.

+1

Не забудьте также переопределить 'hashCode' – Robert

+2

Нет, это не так. – Bohemian

Смежные вопросы