Structure de packaging des collections Java (java.util) - pourquoi Iterable se trouve-t-il dans java.lang?

12

Selon le diagramme ci-dessous, à l'exception de l'interface Iterable, toutes les constructions restantes (interface / classe / classe abstraite) se trouvent dans le même packagejava.util

entrez la description de l'image ici

 

Pourquoi Iterables'asseoir en java.langpaquet?

Remarque: L'intention est de comprendre l'aspect packaging de la programmation java.

suréchange
la source
me demande pourquoi il s'agit de java8 , toutes les API interrogées ici sont beaucoup plus anciennes. Iterable a été introduit dans Java version 1.5, framework de collections dans 1.2
gnat

Réponses:

22

Comme expliqué dans son javadoc , le but de Iterableest de supporter une syntaxe de langage particulière :

L'implémentation de cette interface permet à un objet d'être la cible de l'instruction "foreach"

En tant que tel, il appartient au package lang , qui

Fournit des classes qui sont fondamentales pour la conception du langage de programmation Java.


Les autres classes du diagramme appartiennent à JCF et sont donc dans le package util qui

Contient le cadre des collections ...

moucheron
la source
+1. Je pense, cependant, que cela Iteratordevrait idéalement aussi être dans java.lang, depuis Iterable. Bien sûr, il doit l'être java.utilpour des raisons de compatibilité descendante (il avait été introduit dans le JDK bien avant que la construction "foreach" ne lui donne un rôle dans le langage proprement dit).
ruakh
@ruakh Iterator est pratique, mais était probablement considéré comme trop spécifique (sélection de méthode et dénomination) pour passer au package "fondamental". Pensez à son prédécesseur Enumeration , qui s'est finalement avéré moins pratique qu'on ne le pensait à l'origine, il était prudent qu'il n'aille pas au paquet lang
gnat
Je ne voulais pas dire que c'était pratique, mais que la langue proprement dite en dépend désormais. (Notez que, à part la dépendance de Iterableon Iterator , le java.langpackage ne dépend généralement pas des classes en java.util.)
ruakh
@ruakh je vois. C'est un très bon point, merci. Je peux comprendre pourquoi les concepteurs d'API voulaient qu'Iterable expose "un objet qui effectue l'itération", mais la façon dont ils ont choisi de le faire n'est pas élégante
gnat
6

Parce que beaucoup de choses implémentent l'interface Iterable ou l'étendent comme une sous-interface.

Les classes d'implémentation sont:

  • java.util
    • AbstractCollection
    • AbstractList
    • AbstractQueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • concurrent
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • DataTruncation
    • ...
  • javax.management
    • AttributeList
  • javax.print.attribute.standard
    • JobStateReasons
    • ...
  • ...

Ceci est une énorme liste. Et cela touche toutes sortes de packages.

En outre, vous souhaitez minimiser les dépendances de packages circulaires . Si une classe du package A dépend d'une classe du package B qui dépend d'une classe du package A, vous avez une dépendance circulaire. Ils ne sont pas toujours mauvais lorsqu'ils existent - mais ils conduisent à d'autres dépendances circulaires et cela peut être une mauvaise chose. Ce n'est pas mal en soi, mais c'est une odeur de conception qui indique que le couplage entre deux classes ou packages est trop serré. C'est le début de l'accumulation de dettes techniques.

La solution à cela est de dire "oui, l'interface Iterable est quelque chose qui dépend dans une grande variété de classes et de packages dans l'intégralité de la structure java et javax. Elle devrait se trouver dans la plus base des bibliothèques de langues - java .lang. "

Et c'est là que vous le trouverez.

Lecture connexe:

Communauté
la source