Что такое инкапсуляция
Что проверяют
Понимаете ли вы, что это про защиту инвариантов, а не про механическое написание геттеров и сеттеров.
Как отвечать
Инкапсуляция это объединение данных и работающего с ними поведения в одном месте плюс сокрытие внутреннего устройства за интерфейсом. Снаружи виден набор операций, а как устроено состояние внутри, знать не нужно и нельзя.
Смысл в инварианте: классе, который сам следит за корректностью своего состояния. Счёт с балансом не должен позволять внешнему коду выставить отрицательное значение. Поэтому поле закрыто, а есть операции withdraw и deposit, внутри которых проверка. Как только вместо этого появляется setBalance, инкапсуляция исчезает вместе с проверкой, хотя формально поле осталось приватным.
В Java средства такие: private (только сам класс), без модификатора (пакет), protected (пакет и наследники), public. Пакетная видимость это самая недооценённая: она даёт настоящую границу модуля, а с системой модулей к этому добавляется контроль экспорта пакетов наружу.
Практические детали, которые отличают понимание от заученного определения:
- геттер на коллекцию отдаёт ссылку, и внешний код может изменить внутренний список. Нужна неизменяемая обёртка или копия;
- неизменяемый объект инкапсулирован лучше всего: нечего ломать, потокобезопасен по построению. Для этого есть
record; - набор из приватного поля и пары геттер-сеттер на каждое поле не даёт ничего. Это структура данных с лишними строками, и модель при таком подходе становится анемичной: поведение уезжает в сервисы;
- сеттер не обязан существовать: если значение задаётся при создании, ему место в конструкторе.
Где спотыкаются
Определяют инкапсуляцию как «сделать поля приватными и добавить геттеры».
Отдают наружу изменяемую коллекцию.
Пишут сеттеры на все поля по привычке.
Путают с абстракцией: абстракция это выделение существенного, инкапсуляция это сокрытие реализации.