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
¿Por qué se Iterable
sienta en el java.lang
paquete?
Nota: La intención es comprender el aspecto del empaque de la programación de Java.
java
api
packages
collections
cambio excesivo
fuente
fuente
Respuestas:
Como se explica en su javadoc , el propósito de
Iterable
es admitir una sintaxis de lenguaje particular :Como tal, pertenece al paquete lang , que
Otras clases en el diagrama pertenecen a JCF y, por lo tanto, están en el paquete util que
fuente
Iterator
idealmente también debería estarjava.lang
, ya queIterable
es. Por supuesto, tiene que serjava.util
por 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).Iterable
onIterator
, eljava.lang
paquete generalmente no depende de las clases enjava.util
.)Porque muchas cosas implementan la interfaz Iterable o la extienden como una subinterfaz.
Las clases de implementación son:
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:
fuente