Получить доступ

Класс сделал все поля private и добавил к каждому геттер и сеттер. Достигнута ли инкапсуляция?

MiddleООП
Ещё спрашивают так:
  • Что такое инкапсуляция и почему private-поля с геттерами и сеттерами — это ещё не она?
Коротко

Нет: инкапсуляция — это сокрытие состояния за операциями, которые держат инварианты. Сеттер на каждое поле позволяет привести объект в невозможное состояние: баланс отрицательный, дата конца раньше начала.

  • Вместо setBalance — deposit и withdraw с проверками
  • Вместо setStatus — методы переходов: pay(), ship()
  • Анемичная модель: данные отдельно, правила в сервисах

А ещё Геттеры тоже раскрывают представление — не плодить без нужды

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Смысл инкапсуляции в инвариантах — утверждениях, которые всегда должны быть истинны: баланс не отрицателен, даты начала и конца согласованы, статус меняется только по разрешённым переходам. Класс с сеттером на каждое поле не может гарантировать ничего: любой внешний код приводит объект в невозможное состояние. Правильный подход — выставлять наружу осмысленные операции предметной области (deposit, cancel, reschedule), внутри которых правила и проверяются, а изменяемых полей выставлять как можно меньше. Второй, менее очевидный аспект: геттер, возвращающий внутреннюю изменяемую коллекцию или массив, тоже пробивает инкапсуляцию — здесь нужна защитная копия или неизменяемое представление.

Что хотят услышать

  • Определение через инварианты.
  • Пример плохого и хорошего API.

Частые ошибки

  • Генерировать сеттеры на все поля по привычке или аннотацией.
  • Возвращать из геттера внутреннюю изменяемую коллекцию.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Нет: сеттеры на каждое поле позволяют менять состояние в обход проверок — инкапсуляция про охрану инвариантов, а не про модификаторы доступа
  • ✗Да: private-поля с аксессорами и есть определение инкапсуляции
  • ✗Да, если дополнительно объявить класс final
  • ✗Нет, потому что геттеры возвращают ссылки на объекты

Что спросят дальше

  • Что такое защитное копирование и где оно нужно?
  • Чем инкапсуляция отличается от абстракции?
  • Как быть с DTO, где геттеры и сеттеры действительно нужны?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем