Paketstruktur von Java-Sammlungen (java.util) - Warum sitzt Iterable in java.lang?

12

Wie in der folgenden Abbildung dargestellt, befinden sich Iterablealle übrigen Konstrukte (interface / class / abstract class) mit Ausnahme von interface in demselben Paketjava.util

Bildbeschreibung hier eingeben

 

Warum Iterablesitzt im java.langPaket?

Hinweis: Es wird beabsichtigt, den Paketierungsaspekt der Java-Programmierung zu verstehen.

überaustausch
quelle
Ich frage mich, warum dies mit java8 gekennzeichnet ist. Alle hier abgefragten APIs sind viel älter. Iterable wurde in Java Version 1.5, Collections Framework in 1.2
gnat

Antworten:

22

Wie in seinem Javadoc erklärt , besteht der Zweck von Iterabledarin, eine bestimmte Sprachsyntax zu unterstützen :

Durch die Implementierung dieser Schnittstelle kann ein Objekt das Ziel der "foreach" -Anweisung sein

Als solches gehört es zum lang-Paket , welches

Stellt Klassen bereit, die für den Entwurf der Java-Programmiersprache von grundlegender Bedeutung sind.


Andere Klassen im Diagramm gehören zu JCF und befinden sich daher im util-Paket which

Enthält das Kollektions-Framework ...

Mücke
quelle
+1. Ich denke aber, das Iteratorsollte im Idealfall auch drin sein java.lang, da Iterableist. Natürlich muss es aus java.utilGründen der Abwärtskompatibilität sein (es wurde im JDK eingeführt, lange bevor das "foreach" -Konstrukt ihm eine Rolle in der eigentlichen Sprache gab).
Ruakh
@ruakh Iterator ist praktisch, wurde aber wahrscheinlich als zu spezifisch angesehen (Methodenauswahl und Benennung), um zu einem "grundlegenden" Paket zu gelangen. Denken Sie an seine Vorgänger- Aufzählung , die sich schließlich als nicht so praktisch herausstellte, als ursprünglich gedacht, es war klug, dass es nicht zu lang-Paket ging
gnat
Mein Punkt war nicht, dass es bequem ist, aber dass die eigentliche Sprache jetzt davon abhängt. (Beachten Sie, dass das Paket , abgesehen von der Abhängigkeit von Iterableon Iterator , im java.langAllgemeinen nicht von Klassen abhängt java.util.)
ruakh
@ruakh Ich verstehe. Das ist ein sehr guter Punkt, danke. Ich kann verstehen, warum API-Designer wollten, dass Iterable "ein Objekt enthüllt, das Iterationen durchführt", aber die Art und Weise, wie sie dies gewählt haben, fühlt sich nicht elegant an
Mücke
6

Denn viele Dinge implementieren die Schnittstelle Iterable oder erweitern sie als Subschnittstelle .

Die implementierenden Klassen sind:

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

Dies ist eine riesige Liste. Und es berührt alle Arten von Paketen da draußen.

Darüber hinaus möchten Sie zirkuläre Paketabhängigkeiten minimieren . Wenn eine Klasse in Paket A von einer Klasse in Paket B abhängt, die von einer Klasse in Paket A abhängt, besteht eine zirkuläre Abhängigkeit. Sie sind nicht immer schlecht, dass sie existieren - aber sie führen zu anderen zirkulären Abhängigkeiten und das kann eine schlechte Sache sein. Es ist an sich nicht schlecht, aber es ist ein Designgeruch, der darauf hinweist, dass die Kopplung zwischen zwei Klassen oder Paketen zu eng ist. Es ist der Beginn der Ansammlung technischer Schulden.

Die Lösung hierfür lautet: "Ja, die Iterable-Schnittstelle ist in einer Vielzahl von Klassen und Paketen in der gesamten Java- und Javax-Struktur von Bedeutung. Sie sollte sich in der untersten Ebene der Sprachbibliotheken befinden - Java .lang. "

Und hier finden Sie es.

Verwandte Lesung:

Gemeinschaft
quelle