Урок 20. Инкапсуляция – Devcolibri

Урок 20. Инкапсуляция

После просмотра видеоверсии урока обязательно изучите текстовый материал. Он дополняет видеоматериал и позволит вам полностью понять тему урока.

Практическое применение инкапсуляции

Инкапсуляция позволяет классу иметь полный контроль над его внутренним состоянием.

Представьте, что вы создали класс Rectangle (прямоугольник) с двумя полями:

  • width – ширина.
  • height – высота.

Также у класса Rectangle есть метод getSquare, который считает площадь прямоугольника.

public class Rectangle {
    private int width;
    private int height;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getSquare() {
        return height * width;
    }
}

Пример программы:

public class Main {

    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setWidth(-5);
        rectangle.setHeight(10);

        System.out.println(rectangle.getSquare());
    }
}

Результат: -50.

Площадь прямоугольника не может быть отрицательной. Это значит, что класс Rectangle плохо спроектирован, потому что он должен работать только с не отрицательными числами.

В этом и заключается суть инкапсуляции: класс сам задаёт ограничения для своих свойств и не позволяет остальному коду нарушать эти ограничения.

Вот как можно переписать этот код. Если в setter передают отрицательное число, то мы будем выбрасывать исключение. Про исключения мы поговорим чуть позже, пока просто думайте о них, как о способе сообщить о том, что данные не корректны.

public class Rectangle {

    public void setWidth(int width) {
        if(width < 0) {
            throw new IllegalArgumentException("Ширина должна быть не отрицательной");
        } else {
            this.width = width;
        }
    }

    public void setHeight(int height) {
        if(height < 0) {
            throw new IllegalArgumentException("Высота должна быть не отрицательной");
        } else {
            this.height = height;
        }
    }
}

Теперь мы можем гарантировать, что высота и ширина всегда будут не отрицательными значениями.

Если мы запустим код ещё раз, то увидим:

Exception in thread "main" java.lang.IllegalArgumentException: Ширина должна быть не отрицательной
	at com.alex.Rectangle.setWidth(Rectangle.java:13)
	at com.alex.Main.main(Main.java:8)

Программа закончила своё выполнение, т.к. ширина должна быть не отрицательной.

Возникли проблемы при прохождении? Напишите нам в чат поддержки Вконтакте или Facebook. Мы поможем вам решить проблему и вы сможете продолжить обучение.
УВИДЕТЬ ВСЕ Добавить заметку
ВЫ
Добавить ваш комментарий