Упаковочная структура коллекций Java (java.util) - почему Iterable находится в java.lang?

12

Согласно приведенной ниже диаграмме, за исключением интерфейса Iterable, все остальные конструкции (интерфейс / класс / абстрактный класс) находятся в одном пакетеjava.util

введите описание изображения здесь

 

Почему Iterableсидит в java.langпакете?

Примечание: намерение состоит в том, чтобы понять аспект упаковки Java-программирования.

overexchange
источник
Интересно, почему это помечено java8 , все API, о которых здесь спрашивают, намного старше. Iterable был представлен в Java версии 1.5, среда коллекций в 1.2
gnat

Ответы:

22

Как объясняется в его javadoc , целью Iterableявляется поддержка определенного синтаксиса языка :

Реализация этого интерфейса позволяет объекту быть целью оператора "foreach"

Как таковой, он принадлежит пакету lang , который

Предоставляет классы, которые являются фундаментальными для разработки языка программирования Java.


Другие классы на диаграмме принадлежат JCF и, следовательно, находятся в пакете утилит, который

Содержит рамки коллекций ...

комар
источник
+1. Я думаю, однако, что в Iteratorидеале также должно быть java.lang, так как Iterableесть. Конечно, это должно происходить java.utilпо причинам обратной совместимости (это было введено в JDK задолго до того, как конструкция «foreach» дала ему роль в собственно языке).
Руах
@ruakh Iterator удобен, но, вероятно, считался слишком конкретным (выбор метода и наименование), чтобы перейти к «фундаментальному» пакету. Подумайте о его предшественнике Enumeration , который в итоге оказался не таким удобным, как первоначально предполагалось, было бы благоразумно, что он не пошел к пакету lang
gnat
Я не хотел, чтобы это было удобно, но что от этого зависит сам язык. (Следует отметить , что, помимо зависимости от Iterableна Iterator , то java.langпакет как правило , не зависит от классов java.util.)
ruakh
@ruakh Я вижу. Это очень хороший момент, спасибо. Я могу понять, почему разработчики API хотели, чтобы Iterable выставлял «объект, который выполняет итерацию», но способ, которым они решили сделать это, не выглядит элегантным
комнат
6

Потому что многие вещи реализуют интерфейс Iterable или расширяют его как подчиненный интерфейс.

Классы реализации:

  • java.util
    • AbstractCollection
    • AbstractList
    • AbstractQueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • параллельный
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • DataTruncation
    • ...
  • javax.management
    • AttributeList
  • javax.print.attribute.standard
    • JobStateReasons
    • ...
  • ...

Это огромный список. И это касается всех видов пакетов там.

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

Решение этой проблемы заключается в том, чтобы сказать: «Да, интерфейс Iterable - это то, от чего зависят самые разные классы и пакеты во всей структуре java и javax. Он должен быть в самой базовой языковой библиотеке - java. .lang «.

И вот где вы найдете это.

Связанное чтение:

Сообщество
источник