Estructura de empaquetado de colecciones Java (java.util): ¿por qué Iterable se encuentra en java.lang?

12

Según el diagrama a continuación, a excepción de la interfaz Iterable, todas las construcciones restantes (interfaz / clase / clase abstracta) se encuentran en el mismo paquetejava.util

ingrese la descripción de la imagen aquí

 

¿Por qué se Iterablesienta en el java.langpaquete?

Nota: La intención es comprender el aspecto del empaque de la programación de Java.

cambio excesivo
fuente
me pregunto por qué esto está etiquetado como java8 , todas las API que se preguntan aquí son mucho más antiguas Iterable se introdujo en Java versión 1.5, framework de colecciones en 1.2
gnat

Respuestas:

22

Como se explica en su javadoc , el propósito de Iterablees admitir una sintaxis de lenguaje particular :

La implementación de esta interfaz permite que un objeto sea el objetivo de la declaración "foreach"

Como tal, pertenece al paquete lang , que

Proporciona clases que son fundamentales para el diseño del lenguaje de programación Java.


Otras clases en el diagrama pertenecen a JCF y, por lo tanto, están en el paquete util que

Contiene el marco de colecciones ...

mosquito
fuente
+1. Creo, sin embargo, que Iteratoridealmente también debería estar java.lang, ya que Iterablees. Por supuesto, tiene que ser java.utilpor razones de compatibilidad con versiones anteriores (se había introducido en el JDK mucho antes de que el constructo "foreach" le diera un papel en el lenguaje propiamente dicho).
ruakh
@ruakh Iterator es conveniente, pero probablemente se consideró demasiado específico (selección de método y denominación) para ir al paquete "fundamental". Piense en su predecesora Enumeration , que finalmente no resultó tan conveniente como se pensaba originalmente, era prudente que no fuera al paquete lang
mosquito
Mi punto no era que fuera conveniente, sino que el lenguaje correcto ahora depende de ello. (Tenga en cuenta que, aparte de la dependencia de Iterableon Iterator , el java.langpaquete generalmente no depende de las clases en java.util.)
ruakh
@ruakh ya veo. Ese es un muy buen punto, gracias. Puedo entender por qué los diseñadores querían API Iterable para exponer "un objeto que realiza la iteración", pero la forma en que han optado por hacer esto no se siente elegante
mosquito
6

Porque muchas cosas implementan la interfaz Iterable o la extienden como una subinterfaz.

Las clases de implementación son:

  • java.util
    • ResumenColección
    • AbstractList
    • AbstractQueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • concurrente
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • Truncamiento de datos
    • ...
  • javax.management
    • AttributeList
  • javax.print.attribute.standard
    • JobStateReasons
    • ...
  • ...

Esta es una lista enorme. Y toca todo tipo de paquetes por ahí.

Además, desea minimizar las dependencias de paquetes circulares . Si una clase en el paquete A depende de una clase en el paquete B que depende de una clase en el paquete A, tiene una dependencia circular. No siempre son malos que existan, pero conducen a otras dependencias circulares y eso puede ser algo malo. No es malo en sí mismo, pero es un olor de diseño que indica que el acoplamiento entre dos clases o paquetes es demasiado fuerte. Es el comienzo de la acumulación de deuda técnica.

La solución a esto es decir "sí, la interfaz Iterable es algo de lo que depende una amplia variedad de clases y paquetes en toda la estructura java y javax. Debería estar en la mayoría de las bibliotecas de idiomas: java .lang ".

Y ahí es donde lo encontrarás.

Lectura relacionada:

Comunidad
fuente