Что такое инкапсуляция в ООП и каковы её цели?

«Что такое инкапсуляция в ООП и каковы её цели?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные цели инкапсуляции:

  1. Сокрытие реализации (Information Hiding): Внутреннее устройство класса скрыто от пользователя. Можно изменять реализацию, не ломая внешний код, который использует публичный интерфейс класса.
  2. Защита целостности данных: Поля объявляются private, а доступ к ним предоставляется через публичные методы (геттеры/сеттеры). Это позволяет добавлять проверки и логику при изменении состояния.
  3. Упрощение взаимодействия: Пользователь класса работает с четко определенным публичным API, не вдаваясь в детали.

Практический пример:

public class BankAccount {
    // Данные скрыты (инкапсулированы)
    private String owner;
    private double balance;

    // Публичный конструктор — часть интерфейса
    public BankAccount(String owner, double initialBalance) {
        this.owner = owner;
        this.balance = initialBalance;
    }

    // Публичные методы для доступа и модификации (интерфейс)
    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        if (amount > 0) { // Валидация!
            balance += amount;
        }
    }

    public boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) { // Валидация и бизнес-правило!
            balance -= amount;
            return true;
        }
        return false;
    }
}
// Использование
BankAccount account = new BankAccount("Alice", 1000);
account.deposit(500); // OK
// account.balance = -1000; // ОШИБКА КОМПИЛЯЦИИ: поле private

Преимущества: Повышает надежность, безопасность и поддерживаемость кода, уменьшает связанность между компонентами системы.