Инкапсуляция

Инкапсуляция — механизм, который связывает код и данные, которыми он манипулирует, защищая оба эти компонента от внешнего вмешательства и злоупотреблений. Один из возможных способов представления инкапсуляции — представление в виде защитной оболочки, которая предохраняет код и данные от произвольного доступа со стороны другого кода, находящегося снаружи оболочки. Доступ к коду и данным, находящимся внутри оболочки, строго контролируются тщательно определенным интерфейсом. Чтобы провести аналогию с реальным миром, рассмотрим автоматическую коробку передач автомобиля. Она инкапсулирует сотни бит информации об автомобиле, такой как степень ускорения, крутизна поверхности, по которой совершается движение и положение рычага переключения скоростей. Пользователь (водитель) может влиять на эту сложную инкапсуляцию только одним методом: перемещая рычаг переключения скоростей. На коробку передач нельзя влиять, например, посредством индикатора поворота или дворников. Таким образом, рычаг переключения скоростей — строго определенный (а в действительности единственный) интерфейс к коробке передач. Более того, происходящее внутри коробки передач, не влияет на объекты, находящиеся вне ее. Например, переключение передач не включает фары! Поскольку функция автоматического переключения передач инкапсулирована, десятки изготовителей автомобилей могут реализовать ее каким угодно способом. Однако с точки зрения водителя все эти коробки передач работают одинаково. Аналогичную идею можно применять к программированию. Сила инкапсулированного кода в том, что все знают, как к нему можно получить доступ, и, следовательно, могут его использовать независимо от нюансов реализации и не опасаясь неожиданных побочных эффектов.

В языке Java основой инкапсуляции является класс. Хотя подробнее мы рассмотрим классы в последующих главах книги, сейчас полезно ознакомиться со следующим кратким описанием. Класс определяет структуру и поведение (данные и код), которые будут совместно использоваться набором объектов. Каждый объект данного класса содержит структуру и поведение, которые определены классом, как если бы объект был "отлит" в форме класса. Поэтому иногда объекты называют экземплярами класса. Таким образом, класс — это логическая конструкция, а объект имеет физическое воплощение.

При создании класса определяют код и данные, которые образуют этот класс. Совокупность этих элементов называют членами класса. В частности, определенные классом данные называют переменными-членами или переменными экземпляра. Код, который выполняет действия по отношению к данным, называют переменными-методами или просто методами. (То, что программисты на Java называют методом, программисты на C/C++ называют функциями.) В правильно написанных Java-программах методы определяют способы использования переменных-членов. Это означает, что поведение и интерфейс класса определяются методами, которые выполняют действия по отношению к данным его экземпляра.

Поскольку назначение класса — инкапсуляция сложной структуры программы, существуют механизмы сокрытия сложной структуры реализации внутри класса. Каждый метод или переменная в классе может быть помечена как приватная или общедоступная. Общедоступный интерфейс класса представляет все, что должны или могут знать внешние пользователи класса. Приватные методы и данные могут быть доступны только для кода, который является членом данного класса. Следовательно, любой другой код, не являющийся членом класса, не может получать доступ к приватному методу или переменной. Поскольку приватные члены класса доступны другим частям программы только посредством общедоступных методов класса, можно быть уверенным в невозможности выполнения неправомерных действий. Конечно, это означает, что общедоступный интерфейс должен быть тщательно спроектирован, открывая не слишком много нюансов внутренней работы класса. (рис 2.1)

Инкапсуляция

Рис. 2.1. Инкапсуляция.