Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Java пакеты, как их правильно представить и понять, что в них отсутствует иерархия

#java #package


Написав это import java.awt.*; я не получу, содержимое этого import java.awt.event.*;
 Хотя казалось бы должен получить, если учитывать, что существует иерархия пакетов.
Вроде всё расфасовано по пакетам, в одном пакете, есть еще вложенные пакеты. Но получив
доступ к пакету в котором, есть вложенные, я не получаю содержимого вложенных пакетов.
 Хочется понять, это получается из-за какого-то особого подхода к структурированию
пакетов или же они действительно находятся в иерархической расположенности, но система
не дает доступа к вложенным пакетам, если запрошен главный пакет? 
import java.awt.*; даст мне содержимое import java.awt.event;(заметьте звездочки
нет во втором импорте) ? 
Или же event это тоже пакет, а import java.awt.*; даст мне все классы на этом уровне,
но не пакеты?
Выходит как в виндовс: применил, что то к папке, а там вопрос : применить к вложенным
папкам? Вроде бы иерархия есть, но влияние на неё контролируется.
    


Ответы

Ответ 1



Java рассматривает каждый пакет как независимый. Например, локальные пакеты не распространяются на любые «под»пакеты. Я подозреваю, что использование иерархии значимым образом было бы ценным, но дизайн Java должен был сделать все максимально простым. Java не рассматривает пакеты как действительно подклассифицирующие друг друга; в то время как java.util и java.util.concurrency могут выглядеть так, как будто вторая часть является частью первой, однако они рассматриваются как полностью независимые, а точка в основном используется для аккуратности. Причины этого решения, скорее всего, проистекают из общей тенденции Java к простоте. Лучшая практика часто никогда не использовать подстановочные символы импорта вообще. Согласно спецификации JLS, Section 7.5, возможны только 4 способа произвести импорт: A single-type-import declaration (§7.5.1) imports a single named type, by mentioning its canonical name (§6.7). Одиночный импорт по его «каноническому» имени. Например: import java.util.List; A type-import-on-demand declaration (§7.5.2) imports all the accessible types (§6.6) of a named type or named package as needed, by mentioning the canonical name of a type or package. Импорт всех доступных типов или пакетов по их «каноническому» имени. Это подразумевает, что будут импортированы все имена дочерних пакетов, но не их содержимое. Например: import java.awt.*; A single-static-import declaration (§7.5.3) imports all accessible static members with a given name from a type, by giving its canonical name. Одиночный статический импорт, который импортирует все статические члены пакета. Например: import static org.junit.Assert.assertEquals; A static-import-on-demand declaration (§7.5.4) imports all accessible static members of a named type as needed, by mentioning the canonical name of a type. Импорт всех статических членов пакета. Например: import static org.junit.Assert.*; Пакеты позволяют дать одинаковое имя разным классам. Если бы была возможность импортировать с помощью * всю суб-иерархию пакетов, была бы неразбериха в ваших локальных именах классов. Ассоциация: why doesn't Java have “deep” wildcard import?, Java import all from all

Ответ 2



Нет никакой иерархии пакетов. Есть (псевдо)иерархия названий для удобства. Пакеты сами по себе отдельны, даже если какой-то пакет лежит в подпапке другого пакета, он не является вложенным. Раздел Apparent Hierarchies of Packages в первоисточнике: At first, packages appear to be hierarchical, but they are not. For example, the Java API includes a java.awt package, a java.awt.color package, a java.awt.font package, and many others that begin with java.awt. However, the java.awt.color package, the java.awt.font package, and other java.awt.xxxx packages are not included in the java.awt package. The prefix java.awt (the Java Abstract Window Toolkit) is used for a number of related packages to make the relationship evident, but not to show inclusion. Перевод: На первый взгляд кажется, что пакеты иерархичны, но это не так. Например, Java API включает пакеты java.awt, java.awt.color, java.awt.font и много других, которые начинаются с java.awt. Но ни java.awt.color, ни java.awt.font, ни любой другой пакет java.awt.xxx не входит в пакет java.awt. Префикс java.awt (Java Abstract Window Toolkit) используется для ряда пакетов, чтобы показать, что они связаны между собой (областью применения), но не для того, чтобы показать вложенность.

Комментариев нет:

Отправить комментарий