Добрый день. Подскажите, почему валидатор не принял ниже приведенный код для сравнения полей класса, хотя Кейт Хортсманн утверждает, что именно такой код позволит не просто сравнить данные, а именно проверить, не является ли одно из сравниваемых значений null.
public boolean equals(Object n) {
if(this==n) return true;
if (n==null) return false;
if(n.getClass()!=this.getClass()) return false;
Solution other = (Solution) n;
return Objects.equals(other.first, ((Solution) n).first) && Objects.equals(other.last, ((Solution) n).last);
Татьяна Мацеонжек
35 уровень
Проверка на null в equals
Решен
Комментарии (32)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Татьяна Мацеонжек
29 января 2021, 14:39
Спасибо всем откликнувшимся. Вопрос я задала с ошибкой и все сконцентрировались на этой ошибке. В ответах и комментариях я пыталась акцентировать на сути своего вопроса:
JavaRush предлагает определенный метод переопределения важной функции equals с помощью if (Ksenia Volkova, речь не о готовых решениях). В других источниках предложен другой вариант сравнения, через Objetcs.
Я пыталась понять, может один из вариантов устарел, может есть где то подвох. Есть еще какие-либо нюансы.
Ответа не получила.
Всем спасибо.
0
hidden #2322530
29 января 2021, 14:47
открываем "твой" метод Objects.equals() и смотрим что там "под капотом" происходит.
а это совершенно равноценно варианту с if.
просто вместо того, чтобы писать это всё самому (кучу if) , достаточно использовать готовый метод Objects.equals().
Javarush предлагает тебе вначале научиться писать подробно и самому. чтобы потом на вопрос как это работает, ты могла подробно описать механизм. а не просто "ну там есть команда, она всё сама делает"
Ksenia говорит лишь о том, что большинство задач на Javarush (да и в жизни) можно решить совершенно разными способами. в данном вопросе подразумевается что можно написать самому if , можно использовать Objects.equals() кто что знает. я например тоже не читал Хорстмана. но я знаю что даже в IDEA есть несколько готовых вариантов переопределения equals()
0
hidden #598481
29 января 2021, 14:51
Теперь внятно, спасибо.
Вот ответ.
Утилитный класс Objects появился только в java7, в популярной некогда java6 его не было.
Что касается разницы, достаточно открыть исходник и почитать документацию и сам код, там ничего сложного:
И при генерации выбрать, какую из парадигм использовать: сравнение полей вручную или через Objects.equals() или даже с использованием сторонних библиотек apache и guava. Сравни:
Как видно из реализации, этот метод просто является оберткой, сразу включающей себя проверку на null и не заставляющей программиста держать это в голове, когда он пишет свою реализацию equals().
Более того, IDE, в частности IDEa, позволяют генерировать в два клика:
+1
hidden #598481
29 января 2021, 14:52решение
Методы hashCode() и equals() сгенерированы идеей
+2
Татьяна Мацеонжек
29 января 2021, 15:11
Артем, метод Objects такой же "мой", как и твой. Очевидно, что многолетний опыт порой просто не позволяет взглянуть в суть вопроса.
0
Татьяна Мацеонжек
29 января 2021, 15:12
Спасибо большое, вы мне очень помогли.
+1
hidden #2322530
29 января 2021, 15:21
поэтому фраза и взята в кавычки. у вас проблема не с пониманием процесса, а с нежеланием его понимать. удачи.
0
hidden #598481
29 января 2021, 15:22
Рад, что в конце концов поняли друг друга
0
Ksenia Volkova Java Developer в DXC Master
29 января 2021, 17:23
Вопрос был задан так:
Подскажите, почему валидатор не принял ниже приведенный код...
На него тебе и отвечали - валидатор не принял, потому что код с ошибкой.
Ты продолжала утверждать, что ошибки никакой нет, объекты разные и т.д. - потому этот вопрос и отнял столько времени.
+1
Татьяна Мацеонжек
26 января 2021, 11:58
нет, сравниваются поля двух объектов.
0
Ksenia Volkova Java Developer в DXC Master
26 января 2021, 12:02
0
Татьяна Мацеонжек
26 января 2021, 13:31
Ксения, спасибо.
Да. Я так же сравнивала поля объектов. Валидатор не принял, потому что надо было проверить на null. Как я поняла из учебников - приведенная вами конструкция (и я так же ее использовала) проверяет на null. Может быть она теперь не используется? И нужно явно проверять на null?
0
Wladyslaw Java Developer Master
26 января 2021, 13:37
other и n в твоем коде - это две ссылки которые ссылаются на один и тот же объект
0
Ksenia Volkova Java Developer в DXC Master
26 января 2021, 13:37
"Приведенная мной конструкция" - это и есть кусок твоего кода, и в нем подчернуты ошибки.
Ты сравниваешь поля объектов other и (Solution) n - но это ведь один и тот же объект (о чем и написал Wladyslaw.
+1
Татьяна Мацеонжек
28 января 2021, 10:03
этот не один и тот же объект
0
hidden #598481
28 января 2021, 10:16
Зачем против очевидного, вот же написано:
Ты забыла про объект this в последней строке и сравнила n с ним же, приведенным к типу Solution. 0
Татьяна Мацеонжек
28 января 2021, 16:52
public boolean equals(Object n) {
if(this==n) return true;
if (n==null) return false;
if(n.getClass()!=this.getClass()) return false;
Solution other = (Solution) n;
if ( first != null? !first.equals(other.first) : other.first != null) return false;
return last != null ? last.equals(other.last) : other.last == null;
В этой конструкции first относится к n? А other.first к other?
В этом случае они не сравниваются сами с собой?
0
Wladyslaw Java Developer Master
28 января 2021, 18:56
first относится к this, в данном случае.
A other и n все так же ссылаются на один и тот же объект.
0
Татьяна Мацеонжек
29 января 2021, 10:28
Владислав, спасибо. То есть обоих кодах other и n ссылаются на один объект
Вопрос - почему JavaRush предлагает второй вариант сравнения (мое сообщение от 28.01), а учебник Java Библиотека профессионала, автор Кей Хорстманн, предлагает 1 вариант (мое сообщение от 26.01)? Это как раз то что я хочу выяснить.
0
Ksenia Volkova Java Developer в DXC Master
29 января 2021, 10:39
Можно скрин из Хорстмана (или номер издания и страницу)?
0
Wladyslaw Java Developer Master
29 января 2021, 10:50
ну так во втором варианте ведь this сравнивается с другим объектом.
А other нужен для того, чтобы привести тип, в параметре то Object, а к полям доступ как-бы хотелось бы иметь. Это нормально что они на один объект ссылаются, просто по разному его интерпретируют.
Изначальный вариант тоже работал бы, если в сравнении участвовал бы this.
0
Татьяна Мацеонжек
29 января 2021, 11:19
0
Татьяна Мацеонжек
29 января 2021, 11:20
Десятое издание, 2017 год
0
Ksenia Volkova Java Developer в DXC Master
29 января 2021, 11:22
Ну вот же, сравнивается hireDay и other.hireDay - то есть поля двух разных объектов (this и other).
А у тебя сравнивались поля одного и того же объекта.
0
Татьяна Мацеонжек
29 января 2021, 11:22
Владислав, я протестировала и с this и без. Работают оба варианта
0
hidden #598481
29 января 2021, 11:25
да потому что first и this.first - это одно и то же.
Твоя ошибка была в том, что изначально ты сравнивала n.first и other.first, то есть другими словами n.first и ((Solution) n).first, забыв про this.
+1
Татьяна Мацеонжек
29 января 2021, 11:33
Еще раз - ошибки у меня никакой нет. Работают оба варианта. Мой вопрос - почему JavaRush использует второй.
0
hidden #598481
29 января 2021, 11:38
Еще раз, вот это цитата твоего кода, в нем ошибка:
Такого нет ни у Хорстмана, ни в JR.
Правильно вместо этого сделать так:
0
Ksenia Volkova Java Developer в DXC Master
29 января 2021, 11:47
При твоем варианте equals этот код
выведет true.
Ты по-прежнему считаешь, что ошибки нет? 0
Татьяна Мацеонжек
29 января 2021, 13:26
Спасибо.
Почему JavaRush использует вариант с if а не с Object?
0
Ksenia Volkova Java Developer в DXC Master
29 января 2021, 13:39
Во-первых, что значит "JavaRush использует"? Так было в готовом решении от JR?
Эти решения - это просто рабочие варианты. Нигде не сказано, что это единственно верный способ или эталон.
Во-вторых - а почему нет? Оба варианта будут работать правильно.
Вариант с Objects.equals(...) тоже был бы принят валидатором.
Многие задачи можно решить более чем одним способом.
0
Wladyslaw Java Developer Master
26 января 2021, 11:52
Потому что параметр сам с собой сравнивается, наверное.
+2