Главная » Java » Содержимое пакета

0

Если в исходном файле отсутствует объявление package, то входящие в него типы считаются принадлежащими  к “безымянному” пакету.

К проектированию пакета следует подходить внимательно и включать в него только функционально связанные классы и интерфейсы. Классы пакета могут свободно обращаться к незакрытым членам друг друга. Защита членов класса предназначена для предотвращения некорректных действий со стороны классов, обладающих доступом к деталям внутренней реализации других классов. В пределах пакета не существует никаких ограничений доступа, кроме priv a te, и в итоге может получиться так, что посторонний класс получил к другим классам более близкий доступ, чем вам хотелось бы.

Кроме того, пакет должен составляться исходя из логического разделения задач, чтобы помочь программистам, которые ищут полезные для себя интерфейсы и классы. Если пакет состоит из несвязанных классов, будет сложно понять, что же из этого можно применить в работе. Логическое разделение способствует повторному использованию вашего кода, поскольку программистам будет легче ориентироваться в нем.

Если пакет состоит из взаимосвязанных  типов, вы сможете давать им очевидные имена,

избегая при этом конфликтов с посторонними типами из этого же пакета.

Пакет может быть составной частью другого пакета. Например, пакет java.lang является вложенным, то есть пакет lang входит в более обширный пакет java. Пакет java не содержит ничего, кроме других пакетов. Вложение позволяет построить иерархическую систему имен для взаимосвязанных  пакетов.

Например, чтобы создать набор пакетов для адаптивных систем (скажем, нейросетей или генетических алгоритмов), можно воспользоваться  вложенными пакетами, разделяя их имена точками:

package adaptive.neuralNet;

Исходный файл с таким объявлением входит в пакет adaptive.neuralNet,  который, в свою очередь, является подпакетом пакета adaptive. Пакет adaptive может содержать классы, относящиеся к общим адаптивным алгоритмам, — например, методы с общей постановкой генетических проблем или способы измерения каких-то показателей. Каждый пакет, который находится ниже в иерархии (например, adaptive.neuralNet или adaptive. genetic), содержит классы, предназначенные  для конкретного типа адаптивных алгоритмов.

Вложение пакетов является средством организации взаимосвязанных  пакетов и не имеет отношения к правам доступа. Классы пакета adaptive. genetic не смогут работать с закрытыми на пакетном уровне идентификаторами  из adaptive или adaptive.neuralNet. Область видимости пакета не выходит за его пределы. Вложение позволяет группировать взаимосвязанные  пакеты и помогает программистам искать классы в иерархической структуре, но не дает никаких других преимуществ.

Глава 11

ПАКЕТ ВВОДА/ВЫВОДА

С точки зрения программиста,

пользователь — это периферийное устройство,

вводящее символы в ответ на команду read.

Питер Уильямс

Ввод/вывод в Java описывается в терминах потоков. Потоком /К сожалению, в отечественной литературе одним словом "поток" переводятся совершенно разнородные термины thread (см. выше) и stream, что создает определенную двусмысленность.  В тех случаях, когда контекст не дает однозначного толкования, для перевода thread используется уточняющий термин "программный поток" – Примеч. перев./ называется упорядоченная последовательность  данных, которая имеет источник (входной поток) или приемник (выходной поток). Потоки ввода/вывода избавляют программиста от необходимости вникать в конкретные детали операционной системы и позволяют осуществлять доступ к файлам. В основе работы всех потоков лежит ограниченный набор базовых интерфейсов и абстрактных классов; большинство типов потоков (например, потоки для работы с файлами) поддерживают базовые методы, иногда — с минимальными модификациями. Самый лучший способ освоения ввода/вывода в Java заключается в изучении базовых интерфейсов и абстрактных классов. В качестве примера мы рассмотрим файловые потоки.

Основным исключением из этой модели являются потоки данных, которые читают и записывают значения базовых типов Java, таких как int или string. Эти потоки поддерживают более широкий набор методов, спроектированный  с учетом их специфики. Они рассматриваются  во второй части этой главы, начиная с раздела 11.16.

Пакет ввода/вывода в Java называется java.io. Он импортируется во всех листингах этой главы, даже если строка import и не входит в пример.

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

11.1. Потоки

В пакете java.io определяется несколько абстрактных классов для базовых входных и выходных потоков. Затем эти абстрактные классы расширяются, и на их основе создаются некоторые полезные типы потоков. Потоки почти всегда являются парными: если существует FileInputStream, то есть и FileOutputStream.

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

Класс IOException используется многими методами java.io для сигнализации об исключительных состояниях. Некоторые классы, являющиеся расширениями IOException, сообщают о конкретных проблемах, однако в большинстве случаев все же применяются объекты IOException со строкой-описанием.  Подробности приведены в разделе 11.20.

Перед тем как рассматривать конкретные виды входных и выходных потоков, следует ознакомиться с базовыми абстрактными классами InputStream и OutputStream. Иерархия типов пакета java.io изображена на рис. 11.1.

Рис. 11.1. Иерархия типов в java.io

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии