Изменяемость (mutability). Императивный подход

Пишем класс

Напишем простой класс, который представляет прямоугольник на плоскости. У него будут поля x1 и y1 — координаты левого верхнего угла и поля x2 и y2 — координаты правого нижнего угла.

package online.javanese.basics.oop.mutability;

public final class Rectangle {

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

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

    public void setLeftTop(double x, double y) {
        x1 = x;
        y1 = y;
    }

    public void setRightBottom(double x, double y) {
        x2 = x;
        y2 = y;
    }

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

    // метод для тестирования прямоугольника
    public static void main(String[] args) {
        Rectangle rect = new Rectangle();
        rect.setLeftTop(1, 1);
        rect.setRightBottom(2, 6);
        System.out.println(rect);
    }

}

Метод main позволяет протестировать работу класса. Он выведет:

Rectangle(1.0; 1.0 — 2.0; 6.0)

Мутируем

Напишем больше методов, которые изменяют прямоугольник:

    public void moveLeftTop(double dx, double dy) {
        x1 += dx;
        y1 += dy;
    }
    
    public void moveRightBottom(double dx, double dy) {
        x2 += dx;
        y2 += dy;
    }
    
    public void move(double dx, double dy) {
        moveLeftTop(dx, dy);
        moveRightBottom(dx, dy);
    }

Тестируем:

    public static void main(String[] args) {
        // метод для тестирования прямоугольника
        Rectangle rect = new Rectangle();
        rect.setLeftTop(1, 1); // мутация
        rect.setRightBottom(2, 6); // мутация
        System.out.println(rect);
        rect.move(3, 3); // мутация
        System.out.println(rect);
        rect.move(1.2, -4); // мутация
        System.out.println(rect);
    }
Rectangle(1.0; 1.0 — 2.0; 6.0)
Rectangle(4.0; 4.0 — 5.0; 9.0)
Rectangle(5.2; 0.0 — 6.2; 5.0)

В течение всего метода main мы использовали один объект, который менялся. Опасность такого подхода:

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

        Rectangle copy = rect;
        // указывает на тот же объект

        rect.move(1, 1);
        System.out.println(rect);
        System.out.println(copy);
    }
Rectangle(2.0; 2.0 — 3.0; 3.0)
Rectangle(2.0; 2.0 — 3.0; 3.0)
Комментарии к уроку

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