#java #instance #equality #simplify
#java #экземпляр #равенство #упростить
Вопрос:
Есть ли способ упростить следующий код, целью которого является сравнение двух точек с полями x и y для равенства?
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Object o) {
if (o instanceof Point) {
Point c = (Point) o;
if (!(c.x == this.x amp;amp; c.y == this.y)) {
return false;
} else {
return true;
}
}
return false;
}
}
Ответ №1:
Это можно упростить до:
@Override
public boolean equals(Object o) {
if (!(o instanceof Point)) {
return false;
}
Point c = (Point) o;
return x == c.x amp;amp; y == c.y;
}
Объяснение
Короче и часто понятнее заменить логическое условие if / then, которое возвращает true
/ false
в условии, результатами (или отрицательными результатами) самого логического значения.
Например:
if (someBooleanCondition()) { return true; } else { return false; }
может быть упрощено до
return someBooleanCondition();
Применяя это к вашему примеру:
if (!(c.x == this.x amp;amp; c.y == this.y)) {
return false;
} else {
return true;
}
становится:
return c.x == this.x amp;amp; c.y == this.y;
Сначала я поставил instanceof
проверку, поскольку я чувствую, что короткое замыкание, возвращающее исключительный случай, облегчает чтение кода, хотя это субъективно.
Ответ №2:
Я считаю, что следующее является самым простым
public boolean equals(Object o) {
if (o == null || o.getClass() == getClass()) return false;
return x == ((Point) o).x amp;amp; y == ((Point) o).y;
}
Надеюсь, это помогло вам!
Комментарии:
1. В текущей версии есть ошибка, из-за которой она возвращает false, если оба объекта имеют один и тот же класс; похоже, что
==
должно было быть!=
. Кроме того, эта версия имеет другое поведение, чем метод equals в вопросе, поскольку он не обрабатывает экземпляр подклассаPoint
, представляющий ту же координату (x, y), как равный прямому экземпляруPoint
.