Struktur pengemasan koleksi Java (java.util) - mengapa Iterable berada di java.lang?

12

Seperti pada diagram di bawah ini, kecuali untuk antarmuka Iterable, semua konstruksi yang tersisa (antarmuka / kelas / kelas abstrak) duduk dalam paket yang samajava.util

masukkan deskripsi gambar di sini

 

Mengapa Iterableduduk dalam java.langpaket?

Catatan: Tujuannya adalah untuk memahami aspek pengemasan pemrograman java.

pertukaran berlebihan
sumber
bertanya-tanya mengapa ini ditandai java8 , semua API yang ditanya tentang di sini jauh lebih tua. Iterable diperkenalkan di Java versi 1.5, framework koleksi di 1.2
agas

Jawaban:

22

Sebagaimana dijelaskan dalam javadoc -nya , tujuan dari Iterableadalah untuk mendukung sintaks bahasa tertentu :

Menerapkan antarmuka ini memungkinkan objek untuk menjadi target pernyataan "foreach"

Dengan demikian, itu milik paket lang , yang

Menyediakan kelas yang mendasar untuk desain bahasa pemrograman Java.


Kelas-kelas lain pada diagram milik JCF dan karenanya, ada dalam paket util yang

Berisi kerangka koleksi ...

agas
sumber
+1. Saya pikir, bagaimanapun, Iteratoridealnya juga ada di java.lang, sejak Iterableitu. Tentu saja, itu harus dalam java.utilalasan kompatibilitas ke belakang (telah diperkenalkan di JDK jauh sebelum konstruksi "foreach" memberinya peran dalam bahasa yang tepat).
ruakh
@ruakh Iterator nyaman, tetapi mungkin dianggap terlalu spesifik (pemilihan metode dan penamaan) untuk pergi ke paket "mendasar". Pikirkan pendahulunya Enumeration , yang pada akhirnya ternyata tidak senyaman yang diperkirakan, adalah bijaksana bahwa itu tidak pergi ke paket lang
nyamuk
Maksud saya bukanlah nyaman, tetapi bahasa yang tepat sekarang tergantung padanya. (Perhatikan bahwa, selain dari ketergantungan Iterablepada Iterator , java.langpaket umumnya tidak tergantung pada kelas di java.util.)
ruakh
@ruakh, begitu. Itu poin yang sangat bagus, terima kasih. Saya bisa mengerti mengapa desainer API ingin Iterable untuk mengekspos "objek yang melakukan iterasi" tetapi cara mereka memilih untuk melakukan ini tidak terasa elegan
agas
6

Karena banyak hal mengimplementasikan antarmuka Iterable atau memperluasnya sebagai sub antarmuka.

Kelas implementasi adalah:

  • java.util
    • AbstractCollection
    • AbstractList
    • Abstractueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • bersamaan
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • Dukungan BeanContext
    • ...
  • java.sql
    • BatchUpdateException
    • DataTruncation
    • ...
  • javax.management
    • Daftar Atribut
  • javax.print.attribute.standard
    • Alasan JobState
    • ...
  • ...

Ini daftar yang sangat besar. Dan itu menyentuh semua jenis paket di luar sana.

Selanjutnya, Anda ingin meminimalkan dependensi paket melingkar . Jika kelas dalam paket A tergantung pada kelas dalam paket B yang tergantung pada kelas dalam paket A, Anda memiliki ketergantungan melingkar. Mereka tidak selalu buruk bahwa mereka ada - tetapi mereka mengarah pada dependensi melingkar lainnya dan itu bisa menjadi hal yang buruk. Ini tidak buruk dengan sendirinya, tetapi ini adalah bau desain yang menunjukkan bahwa sambungan antara dua kelas atau paket terlalu ketat. Ini adalah awal dari akumulasi utang teknis.

Solusi untuk ini adalah dengan mengatakan "ya, antarmuka Iterable adalah sesuatu yang bergantung pada berbagai kelas dan paket di seluruh keseluruhan struktur java dan javax. Ini harus berada di pustaka bahasa yang paling dasar - java .lang. "

Dan di situlah Anda akan menemukannya.

Bacaan terkait:

Komunitas
sumber