Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коллоквиум 2012.doc
Скачиваний:
31
Добавлен:
25.08.2019
Размер:
346.11 Кб
Скачать

4. Средства инкапсуляции Java. Поддержка модульности. Пакеты

Основой инкапсуляции в Java является класс. Класс определяет данные и код некоторого набора объектов.  При составлении класса код и данные необходимо специфицировать. Все эти элементы называют членами класса. Члены-переменные или переменные экземпляра являются данными. Члены методы или просто методы – код, оперирующий этими данными. Цель класса – инкапсуляция сложности. Для этого у методов и переменных внутри класса могут быть модификаторы доступа. Инкапсуляция означает, что данные объекта недоступны его клиентам непосредственно. Вместо этого они инкапсулируются — скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным. С позиции инкапсуляции, модификаторы доступа позволяют ограничить нежелательный доступ к членам класса извне. Модификаторы доступа: - public – без ограничений; - private – только из данного класса; - protected – из данного класса и его потомков; - без модификатора – для всех классов данного пакета. 

Открытые члены класса составляют внешнюю функциональность, которая доступна другим классам. Закрытыми (private) обычно объявляются независимые от внешнего функционала члены, а также вспомогательные методы, которые являются лишь деталями реализации и неуниверсальны по своей сути. Благодаря сокрытию реализации класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы. Очень часто используется доступ к свойствам класса только через его методы, который позволяет валидировать значения полей, так как прямое обращение к свойствам отслеживать крайне сложно, а значит им могут присваиваться некорректные значения на этапе выполнения программы. Такой принцип относится к управлению инкапсулированными данными и позволяет быстро изменить способ хранения данных. Если данные станут храниться не в памяти, а в файлах или базе данных, то потребуется изменить лишь ряд методов одного класса, а не вводить эту функциональность во все части системы.

Принцип модульности утверждает — каждый класс должен составлять отдельный модуль. Члены класса, к которым не планируется обращение извне, должны быть инкапсулированы. 

Все классы Java распределяются по пакетам. Кроме классов пакеты могут включать в себя интерфейсы и вложенные подпакеты. Образуется древовидная структура пакетов и подпакетов.  Эта структура в точности отображается на структуру файловой системы. Все файлы с расширением class (содержащие байт-коды), образующие пакет, хранятся в одном каталоге файловой системы. Подпакеты собраны в подкаталоги этого каталога.  Каждый пакет образует одно пространство имен. Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Таким образом, ни один класс, интерфейс или подпакет не может оказаться сразу в двух пакетах. Если надо использовать два класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем пакета: пакет.класс. Такое уточненное имя называется полным именем класса.  Пакетами пользуются еще и для того, чтобы добавить к уже имеющимся правам доступа к членам класса private, protected и public еще один, "пакетный" уровень доступа.  Если член класса не отмечен ни одним из модификаторов private, protected, public, то, по умолчанию, к нему осуществляется пакетный доступ: к такому члену может обратиться любой метод любого класса из того же пакета. Пакеты ограничивают и доступ к классу целиком — если класс не помечен модификатором public , то все его члены, даже открытые, public , не будут видны из других пакетов. 

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

При отображении (хранении) на файловой системе единица компиляции может содержать только один тип, объявленный public, совпадающий по имени с именем файла единицы компиляции.

Пакет содержит несколько единиц компиляции. Типы внутри единицы компиляции имеют доступ ко всем верхнеуровневым типам, объявленным  в других единицах компиляции данного пакета а также к типам пакета java.lang. Для доступа к другим пакетам используется декларация import.

Объявление именованного пакета: PackageDeclaration: package PackageName; В качестве имени пакета выступает полное квалифицированное имя. Единицы компиляции безымянного пакета не содержат объявление пакета. Безымянные пакеты следует использовать только в небольших тестовых программах. Переменная окружения CLASSPATH содержит точки привязки иерархий пакетов к точкам в файловой системе (директории и архивные jar или zip файлы). Классы, находящиеся во всех «корневых» директориях точек привязки CLASSPATH, принадлежат к единому безымянному пакету.

Декларация имени пакета распространяется на всю единицу компиляции. Декларации import также распространяются на всю единицу компиляции. Для того, чтобы получить доступ к членам подпакета в единице компиляции, нужно явно импортировать эти члены. По умолчанию они не видны.

Будучи импортированными, типы становятся доступны в единице компиляции с использованием простого (не квалифицированного) имени.

Для того, чтобы иметь возможность обращаться к статическим методам, полям класса, а также к элементам перечислений без использования квалифицированного имени, можно воспользоваться статической декларацией импорта

Для обеспечения уникальности имени пакета в качестве основы следует использовать доменное имя организации. В случае если доменное имя не может быть использовано в силу наличия специальных символов, запрещенных к использованию в идентификаторах, нужно произвести следующую трансформацию: - если имя содержит знак ‘-’, его заменяют на ‘_’; - если имя является ключевым словом, то к нему добавляют ‘_’ - если имя начинается с цифры, то спереди добавляется ‘_’.

Полным квалифицированным именем является: - для примитивных типов – ключевое слово типа; - для именованного пакета первого уровня – простое имя этого пакета; - для именованного пакета уровня N – полное квалифицированное имя объемлющего пакета плюс простое имя пакета; - для класса или интерфейса в безымянном пакете – простое имя этого класса или интерфейса; - полное квалифицированное имя класса или интерфейса в именованном пакете – это полное квалифицированное имя пакета плюс простое имя класса или интерфейса. - класс (интерфейс) – член другого класса имеет полное квалифицированное имя только если таковое имеется у класса его содержащего. Исключение – безымянные классы. - Полное квалифицированное имя массива – это полное квалифицированное имя компонентного типа с последующим []

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]