Класс сделал все поля private и добавил к каждому геттер и сеттер. Достигнута ли инкапсуляция?
- Что такое инкапсуляция и почему private-поля с геттерами и сеттерами — это ещё не она?
Нет: инкапсуляция — это сокрытие состояния за операциями, которые держат инварианты. Сеттер на каждое поле позволяет привести объект в невозможное состояние: баланс отрицательный, дата конца раньше начала.
- Вместо setBalance — deposit и withdraw с проверками
- Вместо setStatus — методы переходов: pay(), ship()
- Анемичная модель: данные отдельно, правила в сервисах
А ещё Геттеры тоже раскрывают представление — не плодить без нужды
Подробно
Смысл инкапсуляции в инвариантах — утверждениях, которые всегда должны быть истинны: баланс не отрицателен, даты начала и конца согласованы, статус меняется только по разрешённым переходам. Класс с сеттером на каждое поле не может гарантировать ничего: любой внешний код приводит объект в невозможное состояние. Правильный подход — выставлять наружу осмысленные операции предметной области (deposit, cancel, reschedule), внутри которых правила и проверяются, а изменяемых полей выставлять как можно меньше. Второй, менее очевидный аспект: геттер, возвращающий внутреннюю изменяемую коллекцию или массив, тоже пробивает инкапсуляцию — здесь нужна защитная копия или неизменяемое представление.
Что хотят услышать
- Определение через инварианты.
- Пример плохого и хорошего API.
Частые ошибки
- Генерировать сеттеры на все поля по привычке или аннотацией.
- Возвращать из геттера внутреннюю изменяемую коллекцию.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Да: private-поля с аксессорами и есть определение инкапсуляции
- ✓Нет: сеттеры на каждое поле позволяют менять состояние в обход инвариантов
- ✗Да, если дополнительно объявить класс final
- ✗Нет, потому что геттеры возвращают ссылки на объекты, а не их копии
Что спросят дальше
- Что такое защитное копирование и где оно нужно?
- Чем инкапсуляция отличается от абстракции?
- Как быть с DTO, где геттеры и сеттеры действительно нужны?
Разбор темы
- ООП и его принципы
Инкапсуляция, наследование, полиморфизм, абстракция — зачем они нужны, как работают внутри и почему композицию предпочитают наследованию.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.