Java koleksiyonlarının paketleme yapısı (java.util) - neden yinelenebilir java.lang'da oturuyor?


12

Aşağıdaki şemaya göre, arayüz hariç Iterable, kalan tüm yapılar (arayüz / sınıf / soyut sınıf) aynı pakette otururjava.util

resim açıklamasını buraya girin

 

Neden pakette Iterableoturuyor java.lang?

Not: Amaç, java programlamanın paketleme yönünü anlamaktır.


bunun neden java8 olarak etiketlendiğini merak ediyorum , burada sorulan tüm API'ler çok daha eski. Yinelenebilir Java sürüm 1.5, koleksiyon çerçeve 1.2
gnat

Yanıtlar:


22

Onun açıklandığı gibi javadoc , amacı Iterableetmektir özellikle dil sözdizimi destekleyen :

Bu arabirimin uygulanması, bir nesnenin "foreach" ifadesinin hedefi olmasını sağlar

Bu nedenle, lang paketine aittir ,

Java programlama dilinin tasarımı için temel olan sınıflar sağlar.


Diyagramı Diğer sınıflar ait JCF içindedir, ve bundan dolayı util paketi olan

Koleksiyon çerçevesini içerir ...


+1. Bence bu Iteratorideal olarak da olmalı java.lang, çünkü Iterable. Tabii ki, java.utilgeriye dönük uyumluluk nedenlerinden dolayı olmalı ("foreach" yapısı ona uygun dilde bir rol vermeden çok önce JDK'da kullanılmaya başlanmıştı).
ruakh

@ruakh Yineleyici uygundur, ancak büyük olasılıkla "temel" pakete gidemeyecek kadar spesifik (yöntem seçimi ve adlandırma) olarak değerlendirilmiştir. Sonunda sanıldığı kadar uygun olmadığı ortaya çıkan selefi Numaralandırma'yı düşünün, lang paketine gitmemesi ihtiyatlıydı
gnat

Demek istediğim, bunun uygun olmadığı, ancak uygun dilin buna bağlı olduğu idi. (Not kenara bağlı olmasının dışında, bu Iterableüzerinde Iterator , java.langpaket genel sınıfları bağımlı değildir java.util.)
ruakh

@ruakh anlıyorum. Bu çok iyi bir nokta, teşekkürler. API tasarımcılarının neden "yinelemeyi gerçekleştiren bir nesneyi" ortaya çıkarmak için yinelenebilir istediklerini anlayabiliyorum, ancak bunu yapmayı seçtikleri yol zarif görünmüyor
gnat

6

Çünkü birçok şey yinelenebilir arabirimi uygular veya bir alt arabirim olarak genişletir.

Uygulama sınıfları:

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

Bu çok büyük bir liste. Ve her türlü pakete dokunuyor.

Ayrıca, dairesel paket bağımlılıklarını en aza indirmek istersiniz . A paketindeki bir sınıf, B paketindeki A paketindeki bir sınıfa bağlı olan bir sınıfa bağlıysa, dairesel bir bağımlılığınız vardır. Her zaman var oldukları için kötü değildirler - ancak diğer dairesel bağımlılıklara yol açarlar ve bu kötü bir şey olabilir. Tek başına kötü değil, ancak iki sınıf veya paket arasındaki bağlantının çok sıkı olduğunu gösteren bir tasarım kokusudur. Bu biriken teknik borcun başlangıcıdır.

Bunun çözümü, "evet, Yinelenebilir arayüz, java ve javax yapısının tamamı boyunca çok çeşitli sınıflara ve paketlere bağlı bir şeydir. Dil kütüphanelerinin en temelinde olmalıdır - java .lang."

Ve onu bulacağınız yer.

İlgili okumalar:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.