Инкапсуляция в Java
Основой инкапсуляции в Java является класс. Класс определяет данные и код некоторого набора объектов. Объект является экземпляром класса. Таким образом, класс - это логическая конструкция, а объект – физическая реальность.
При составлении класса код и данные необходимо специфицировать. Все эти элементы называют членами класса. Члены-переменные или переменные экземпляра являются данными. Члены методы или просто методы – код, оперирующий этими данными.
Цель класса – инкапсуляция сложности. Для этого у методов и переменных внутри класса могут быть модификаторы доступа (public, private).
Инкапсуляция означает, что данные объекта недоступны его клиентам непосредственно. Вместо этого они инкапсулируются — скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным.
Модификаторы доступа Модификаторы доступа можно рассматривать как с позиции инкапсуляции так и наследования. Если рассматривать с позиции инкапсуляции, то модификаторы доступа позволяют ограничить нежелательный доступ к членам класса извне.
Модификатор доступа | Область доступа |
public | Без ограничений |
private | Только из данного класса |
protected | Из данного класса и его потомков |
Без модификатора | Для всех классов данного пакета |
Открытые члены класса составляют внешнюю функциональность, которая доступна другим классам. Закрытыми (private) обычно объявляются независимые от внешнего функционала члены, а также вспомогательные методы, которые являются лишь деталями реализации и неуниверсальны по своей сути. Благодаря сокрытию реализации класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы.
Очень часто программистами используется доступ к свойствам класса только через его методы (принцип bean классов), который позволяет валидировать значения полей, так как прямое обращение к свойствам отслеживать крайне сложно, а значит им могут присваиваться некорректные значения на этапе выполнения программы. Такой принцип относится к управлению инкапсулированными данными и позволяет быстро изменить способ хранения данных. Если данные станут храниться не в памяти, а в файлах или базе данных, то потребуется изменить лишь ряд методов одного класса, а не вводить эту функциональность во все части системы.
Программный код, написанный с использованием этого принципа легче отлаживать. Для того чтобы узнать, в какой момент времени и кто изменил свойство интересующего нас объекта, достаточно добавить вывод отладочной информации в тот метод объекта, посредством которого осуществляется доступ к свойству этого объекта. При использовании прямого доступа к свойствам объектов программисту бы пришлось добавлять вывод отладочной информации во все участки кода, где используется интересующий нас объект.
Автоупаковка (outboxing)
В Java 2 5.0 введена автоупаковка примитивов. Автоупаковка – это процесс автоматической инкапсуляции данных примитива (простого типа) в эквивалентную объектную оболочку типа. Автоупаковка примитива в объектную оболочку требуется потому, что примитивы лежат вне иерархии классов. Чаще всего процесс автоупаковки необходим при работе с коллекциями, так как коллекции оперируют объектами.
До появления автоупаковки процесс упаковки производился вручную с помощью операции new, например:
Integer iOb = new Integer(100);
С помощью автоупаковки, введенной в версии 5.0 создание объекта явно не происходит, инкапсуляция происходит автоматически:
Integer iOb = 100;
При этом нет необходимости в явном создании объекта нужного типа.
Ссылки:
- Шилдт Г. Java 2, v5.0 (Tiger). Новые возможности: Пер. с англ. – СПб.: БХВ-Петербург, 2005. – 208 с.