И снова я хочу больше, чем заложили изначально в задачу.
Те, кому это ещё не надоело, помогите разобраться, я запутался.
Изначально в условиях не сказано и Валидатор спокойно принимает без проверки на такое условие:
Допустим, user был изначально создан БЕЗ инициализации поля firstName. Все остальные поля инициализированы.
Наша задача: save -> load, и чтобы методы hashCode и equals выдали true.
По сути, у нас в файл запишется текстовое "null" при таком раскладе (это если мы сознательно на этапе инициализации не заложим логику, что не должно быть null).
При чтении файла мы учитываем это и присваиваем "нормальное" null полю firstName loadedObject:
String fn = reader.readLine();
user.setFirstName(fn != "null" ? fn : null);
По идее, когда мы будем сравнивать объекты User через класс JavaRush (плюс я еще проверяю состояние firstName):
System.out.println(javaRush.hashCode() == loadedObject.hashCode());
System.out.println(javaRush.equals(loadedObject));
System.out.println(javaRush.users.get(0).getFirstName());
System.out.println(loadedObject.users.get(0).getFirstName());
мы выйдем на проверку переопределенными методами equals и hashCode класса User, которые учитывают null:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (isMale != user.isMale) return false;
if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false;
if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false;
if (birthDate != null ? !birthDate.equals(user.birthDate) : user.birthDate != null) return false;
return country == user.country;
}
@Override
public int hashCode() {
int result = firstName != null ? firstName.hashCode() : 0;
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
result = 31 * result + (birthDate != null ? birthDate.hashCode() : 0);
result = 31 * result + (isMale ? 1 : 0);
result = 31 * result + (country != null ? country.hashCode() : 0);
return result;
}
Однако, в консоль я получаю:
false
false
null
null
Что я не понял или делаю не так?
И можно ли как-то получить true, при этом оставив поля не инициализированными?
VladSL
27 уровень
А если бы в задаче учитывалось, что какие-то поля класса User могли быть не проинициализированы?
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
YuriyExpert
18 ноября 2019, 11:05полезный
Писать просто "null" для строки неправильно, т.к. строка может быть "null" (именно эти 4 символа). Корректным решением будет писать признак пустой строки и только потом само значение.
+1
VladSL
18 ноября 2019, 11:10
понял. попробую
0
IceBergMaster
18 ноября 2019, 10:59решение
Кто же так строки сравнивает?)
+2
VladSL
18 ноября 2019, 11:08
Точно... Загнался... Пора передохнуть
0