Страницы

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

вторник, 16 апреля 2019 г.

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

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


Ответ

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

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

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