Инкапсуляция (скрытие информации) позволяет вам выставить только абсолютный минимум для внешнего мира. Это означает, что вы можете изменить не выставленные биты на содержание вашего сердца, не влияя на клиентов.
Показательный пример. Допустим, вы реализовали структуру данных, которая содержит строки в массиве. Если вы выставите массив, пользователи вашей структуры данных могут просто использовать str[7]
, чтобы получить строку в позиции 7.
Теперь, что произойдет, если вы решите повторно реализовать свою структуру данных в виде сбалансированного дерева, чтобы ускорить поиск строк. Вы делаете это, перемещая строки в дерево и изменяя свой массив на не строки, а указатели на места внутри дерева.
Это сломает ваших клиентов, потому что они будут ожидать строк, а не указателей. Каждый клиент должен был бы измениться, чтобы получить указатели из массива, а затем искать их в дереве.
Однако, если вы полностью скрыли реализацию и просто предоставили функцию:
String getStringAt (int n);
вы бы просто изменили структуру данных и , чтобы функция оставалась совместимой.
Клиенты не не ломаются, потому что ваш интерфейс прикладного программирования (API) не изменился.
Одно из самых важных правил, которым я следую на уроках, - стремиться к максимальной согласованности, минимальной связи . Другими словами, у одного класса должно быть все, что ему нужно (не более), и он должен иметь как можно меньше обмена информацией с внешним миром.
Это означает, что все , которые могут сделать клиенты, это вызвать API. Не раскрывайте не API-методы или не разрешайте беспрепятственный доступ к публичным переменным - все должно быть сделано с помощью сеттеров и геттеров.