Содержимое пакета
Содержимое пакета должно быть тщательно разработано, чтобы они включали только функционально релевантные классы и интерфейсы. Занятия в пакете могут свободно получить доступ к не-частным членам других классов в пакете, и некоторые классы могут даже иметь достаточные разрешения для доступа к внутренним деталям других классов. Чтобы избежать неправильных классов, мы должны защищать членов класса. Любого участника, не объявленного частным, может получить доступ к всем другим типам в одном и том же пакете, поэтому любые не связанные с ним классы могут быть более вероятной скоординированной, чем мы ожидаем.
Пакеты также предоставляют логическую группировку для программистов, ищущих полезные интерфейсы и классы. Пакеты, состоящие из не относящихся к делу классов, мешают программистам, какие интерфейсы и классы полезны, а логическая группировка классов может помочь программистам повторно использовать код, потому что программисты могут найти то, что им нужно легче, путем логической группировки. Если пакет содержит только связанные, тесно связанные наборы типов, это означает, что мы можем дать типу несколько более интуитивно понятных имен, чтобы избежать конфликтов имен.
Пакеты могут быть вложены. Например, Java.Lang - это вложенный пакет, в котором пакет Lang вложен в большую упаковку Java, а в пакете J Ava также содержится некоторые другие пакеты. Гнездование заставляет связанные пакеты образуют систему именования с иерархической структурой.
Например, чтобы создать набор пакетов для адаптивных систем, таких как нейронные сети и генетические алгоритмы, мы можем назвать пакеты с разделенными точками именами для создания вложенных пакетов:
пакет адаптивен. нейронная сеть;
Исходной файл, содержащий приведенный выше заявление об объявлении, находится в пакете Adaptive.neralnet, а сам пакет Adaptive.neralnet - это подпака адаптивного пакета. Адаптивный пакет может содержать некоторые классы, связанные с общими адаптивными алгоритмами, такими как классы операторов задачи обобщения или эталонные классы. Пакеты, которые находятся в более глубоком положении в иерархии (например, Adaptive.Neu-ralnet или Adaptive.genetic), содержат классы, связанные с определенным типом адаптивного алгоритма.
Гнездование пакетов - это всего лишь инструмент для организации связанных пакетов, и оно не обеспечивает никаких специальных прав доступа между пакетами.
Код класса в пакете Adaptive.Genetic не может получить доступ к участникам в пакете Adaptive или Adaptive.neralnet, который имеет права доступа к пакетам, а область пакета применима только к конкретным пакетам. Гнездование пакетов может группировать соответствующие пакеты и помочь программистам найти желаемый класс на логическом уровне более удобно, но помимо этого он не приносит никаких других преимуществ.
Примечания к пакетам
Пакет также может иметь аннотации. Но проблема в том, что, поскольку пакеты являются организационной структурой и не имеют сущностей исходного кода, и они не имеют фактического определения, их нельзя аннотировать, как классы или методы. Поэтому аннотация пакета может быть достигнута только путем аннотирования заявления об объявлении пакета в исходном файле. Тем не менее, в каждом пакете может быть только одно объявление пакета, в которых могут быть аннотации, которые действуют на него.
Итак, как вы аннотируете пакеты? Фактически, Java не заставляет программистов использовать какой -то способ справиться с правилом «Одиночный аннотированный оператор пакета». Рекомендуемый способ состоит в том, чтобы создать файл с именем пакета-i nfo.java в каталоге пакетов, в котором хранятся только операторы пакета и аннотации пакета, не размещая ничего другого. Например, файл пакета Info.java для пакета ATTR выглядит так:
@Packagespec (Назовите два «ATTR Project», version = "1.0" @Developmentsite ("attr.project.org") @DevelopmentModel ("Open-Source") ATRT;Packagespec, разработки и разработка OpmentModel используются для изменения типов аннотаций. Конечно, у них есть стратегии сохранения времени выполнения. Файл Package-info.java должен быть скомпилирован с другими исходными файлами в пакете.
Мы рекомендуем разместить всю информацию, связанную с пакетом, в файл пакета info.java. Если вы сделаете это, вы можете разместить комментарии документов в начале файла, чтобы эти документы были аннотированы в качестве пакетных документов.
Объекты и спецификации упаковки
Пакеты обычно реализуют некоторые спецификации и обычно из организации. Объекты пакета отличаются от других типов отражений и не могут использоваться для создания или эксплуатации пакетов, но могут служить только базой знаний для предоставления информации, которая предоставляет информацию о спецификациях, реализованных пакетом (заголовок, поставщик и номер версии спецификации) и информацию о реализации самого пакета (название, поставщик и номер версии пакета). Хотя пакеты обычно поступают от отдельных организаций, спецификации, которые она реализует (такие как библиотеки статистического анализа), могут быть определены другими организациями. Программы с использованием пакетов, возможно, должны знать версию спецификации, реализованной пакетом, так что можно использовать функции, определенные только в определенной версии. Точно так же эти программы также могут знать, какая версия реализации предоставлена для нее, главным образом для работы с возможными недостатками в разных версиях. Некоторые из основных методов класса пакетов разрешают доступ к этой информации:
Например, если вы извлеките эту информацию из пакета java.lang в нашей системе, вы получите следующие результаты: '
Название спецификации: Java Platform Platform Specization Спецификация Версия: 1.4 Спецификация поставщик: Sun Microsystems, Inc. Название реализации: Версия реализации среды выполнения Java: 1.5.0_02 поставщик реализации: Sun Microsystems, Inc.
Канонический номер версии состоит из неотрицательных чисел, разделенных периодами делимитиров, таких как «2,0» или '11 .0.12 '. Этот шаблон позволяет нам вызвать метод Iscompatible с сравнением номер версии, который следует за этим шаблоном с номером версии пакета. Если номер версии пакета больше или равен номеру версии преемника, то метод возвращает true. Это сравнение сравнивает только отдельное число, разделенное периодом за раз. Если какое -либо из этих чисел меньше, чем соответствующая позиция в номере пропущенной версии, то две версии несовместимы. Если одно из номеров версий длиннее другого, отсутствующая часть в коротких номерах версий будет считаться нулевым. Например, если канонический номер версии пакета составляет «1.4», и мы сравниваем его с «1.2», «1.3.1». Или «.1.81., Тогда верно будет возвращено; но при сравнении с «1.4.2 '.
Не существует указанного формата для номера версии реализации, поскольку различные организации, которые предоставляют реализацию, будут по -разному определять версию реализации. Единственное сравнение, которое можно провести между версиями реализации, - это проверить, является ли версия одинаковой, где нет предположения о обратной совместимости.
Пакет может быть запечатан, что означает, что классы больше не могут быть добавлены в упаковку. Открытые пакеты могут содержать классы из разных мест в пути поиска класса, в то время как содержимое герметичного пакета должно поступать из одного и того же места - либо конкретного архива, либо местоположения, указанного URL. Есть два способа определить, закрыт ли пакет:
.public boolean asseal p: return trueo, если упаковка запечатана
.public Boolean Issealed (URL URL): вернуть true, если упаковка запечатана для данного URL, то есть классы в упаковке могут быть загружены из данного URL. Если класс в пакете не может быть загружен из данного URL -адреса, или пакет не запечатан, то FALSE возвращается, а информация о спецификации и реализации пакета обычно предоставляется как часть манифестного файла, хранящегося в пакете - например, как часть манифестного файла в архиве Java (JAR), как описано в разделе 25.9.2, «Archive File Java». Когда класс в упаковке загружается, эта информация читается человеком. ClassLoader может динамически определить объект пакета для класса, который он хочет загрузить:
Мы можем вызвать метод GetPackage объекта класса данного класса, чтобы получить объект пакета этого класса. Мы также можем позвонить в статический пакет. Оба метода связаны с загрузчиком класса, который вызывает их код, потому что эти коды будут вызывать методы Get-Package или GetPackages их загрузчика класса. Методы загрузчиков этих классов будут искать конкретный загрузчик класса и все его родительские загрузчики класса, и если настройки не будут сделаны для текущего загрузчика класса, в настоящее время будет использоваться системный загрузчик класса. Обратите внимание, что если пакет неизвестен, метод ClassLader будет возвращать NULL, потому что в настоящее время не было загружено никакого типа в пакете.