Неизменяемость (immutability). Функциональный подход

Теперь сделаем прямогольник неизменяемым: один прямоугольник может находиться только в одном месте. Если нам необходимо его передвинуть, нужно просто создать другой прямоугольник.

Все поля будут финальными.

package online.javanese.basics.oop.immutability;

public final class Rectangle {

    // левый верхний угол
    private final double x1;
    private final double y1;

    // правый нижний угол
    private final double x2;
    private final double y2;

Конструктор останется один: в большинстве случаев иммутабельным классам не нужен копирующий конструктор.

    public Rectangle(double x1, double y1, double x2, double y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }

Любое передвижение будет создавать новый прямоугольник:

    public Rectangle moveLeftTop(double dx, double dy) {
        return new Rectangle(x1 + dx, y1 + dy, x2, y2);
    }

    public Rectangle moveRightBottom(double dx, double dy) {
        return new Rectangle(x1, y1, x2 + dx, y2 + dy);
    }

    public Rectangle move(double dx, double dy) {
        return new Rectangle(x1 + dx, y1 + dy, x2 + dx, y2 + dy);
    }

Метод toString не изменился.

    @Override
    public String toString() {
        return "Rectangle(" + x1 + "; " + y1 + " — " + x2 + "; " + y2 + ")";
    }

Проверяем:

    public static void main(String[] args) {
        // метод для тестирования прямоугольника
        Rectangle original = new Rectangle(0, 0, 0, 0);

        Rectangle moved = original.move(1, 1);
        System.out.println(original);
        System.out.println(moved);
    }

}
Rectangle(0.0; 0.0 — 0.0; 0.0)
Rectangle(1.0; 1.0 — 1.0; 1.0)

Такой подход к решению задач называется функциональным и в большинстве случаев он предпочтительнее, чем императивный.

Комментарии к уроку

Сообщить об ошибке