Согласно приведенной ниже диаграмме, за исключением интерфейса Iterable
, все остальные конструкции (интерфейс / класс / абстрактный класс) находятся в одном пакетеjava.util
Почему Iterable
сидит в java.lang
пакете?
Примечание: намерение состоит в том, чтобы понять аспект упаковки Java-программирования.
java
api
packages
collections
overexchange
источник
источник
Ответы:
Как объясняется в его javadoc , целью
Iterable
является поддержка определенного синтаксиса языка :Как таковой, он принадлежит пакету lang , который
Другие классы на диаграмме принадлежат JCF и, следовательно, находятся в пакете утилит, который
источник
Iterator
идеале также должно бытьjava.lang
, так какIterable
есть. Конечно, это должно происходитьjava.util
по причинам обратной совместимости (это было введено в JDK задолго до того, как конструкция «foreach» дала ему роль в собственно языке).Iterable
наIterator
, тоjava.lang
пакет как правило , не зависит от классовjava.util
.)Потому что многие вещи реализуют интерфейс Iterable или расширяют его как подчиненный интерфейс.
Классы реализации:
Это огромный список. И это касается всех видов пакетов там.
Кроме того, вы хотите минимизировать циклические зависимости пакетов . Если класс в пакете A зависит от класса в пакете B, который зависит от класса в пакете A, у вас есть циклическая зависимость. Они не всегда плохи тем, что существуют, но они приводят к другим круговым зависимостям, и это может быть плохо. Само по себе это неплохо, но это запах конструкции, который указывает на то, что связь между двумя классами или пакетами слишком тесная. Это начало накопления технического долга.
Решение этой проблемы заключается в том, чтобы сказать: «Да, интерфейс Iterable - это то, от чего зависят самые разные классы и пакеты во всей структуре java и javax. Он должен быть в самой базовой языковой библиотеке - java. .lang «.
И вот где вы найдете это.
Связанное чтение:
источник