Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Инкапсуляция в Java: подробное руководство с практическим примером

Что такое инкапсуляция в Java?

Инкапсуляция — один из ключевых столпов объектно-ориентированного дизайна в Java. Она связывает данные (поля) и операции, манипулирующие этими данными (методы), в единую самодостаточную единицу — класс. Скрывая внутреннее состояние за хорошо определённым интерфейсом, инкапсуляция защищает объекты от непреднамеренного вмешательства и делает код легче в поддержке и тестировании.

В этом туториале вы узнаете:

Нажмите здесь, если видео недоступно

Изучение инкапсуляции на примере

Для иллюстрации рассмотрим простой класс банковского счёта с функционалом депозита и отображения баланса.

class Account {
    private int accountNumber;
    private int accountBalance;
    public void showData() {
        // код отображения данных
    }
    public void deposit(int amount) {
        if (amount < 0) {
            // показать ошибку
        } else {
            accountBalance = accountBalance + amount;
        }
    }
}

Представьте, что злоумышленник имеет доступ к исходнику и пытается внедрить отрицательный депозит -100. Два вектора атаки:

Подход 1: Прямое изменение поля accountBalance. Поскольку поле объявлено private, оно недоступно извне класса Account, предотвращая атаку.

Инкапсуляция в Java: подробное руководство с практическим примером

Как видите, модификатор private обеспечивает инкапсуляцию и защищает внутреннее состояние.

Инкапсуляция в Java: подробное руководство с практическим примером

Поэтому хакер не может подправить баланс напрямую.

Инкапсуляция в Java: подробное руководство с практическим примером

Подход 2: Использование публичного метода deposit для добавления отрицательной суммы. Метод содержит проверку, отвергающую любую сумму меньше нуля, блокируя и эту попытку.

Инкапсуляция в Java: подробное руководство с практическим примером

Таким образом, инкапсуляция гарантирует, что только легитимные операции могут менять состояние объекта.

Инкапсуляция в Java: подробное руководство с практическим примером

Весь класс ведёт себя как запечатанная капсула — данные скрыты, взаимодействие происходит только через хорошо определённые сообщения. Это суть инкапсуляции.

Инкапсуляция в Java: подробное руководство с практическим примером

Сокрытие данных в Java

Сокрытие данных — практика ограничения прямого доступа к полям объекта извне его определяющего класса. В Java ключевое слово private обеспечивает это ограничение, делая поле невидимым для всех других классов. Это сохраняет внутреннее представление непрозрачным, позволяя разработчикам менять его без ломания зависимого кода.

Иногда требуется менее строгий доступ, напр. protected или public для наследования или утилитных классов. Однако инкапсуляция поощряет использование private полей в паре с контролируемыми аксессорными методами.

Геттеры и сеттеры в Java

Геттеры (аксессоры) и сеттеры (мутаторы) предоставляют контролируемый интерфейс для чтения и обновления приватных полей. Они позволяют валидацию, логирование или ленивую инициализацию, сохраняя инкапсуляцию.

Пример:

class Account {
    private int accountNumber;
    private int accountBalance;
    // аксессор
    public int getBalance() {
        return this.accountBalance;
    }
    // мутатор
    public void setNumber(int num) {
        this.accountNumber = num;
    }
}

Здесь getBalance() возвращает текущий баланс, а setNumber() присваивает новый номер счёта.

Абстракция против инкапсуляции

Хотя связаны, абстракция и инкапсуляция служат разным целям:

Представьте смартфон: сложная схема инкапсулирована за сенсорным интерфейсом, а абстракция даёт высокоуровневые функции — звонки, сообщения.

Преимущества инкапсуляции в Java

java

  1. Инкапсуляция в Java: практическое руководство по скрытию данных
  2. Освоение приведения типов в Java: от расширения к сужению и далее
  3. Метод String.length() в Java: как получить длину строки (пример)
  4. Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
  5. Метод String.contains() в Java: как проверить наличие подстроки — примеры
  6. Освоение String.endsWith() в Java: проверка суффиксов строки с примерами
  7. Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
  8. Алгоритм сортировки вставками в Java: понятный пример и пошаговое руководство
  9. Сортировка выбором в Java: пошаговый пример и полный код
  10. Инкапсуляция в Java: сокрытие данных и контроль доступа