Есть ли способ упростить этот код, сравнивая две точки с полями x и y для равенства?

#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 .