โครงสร้างบรรจุภัณฑ์ของคอลเลกชัน Java (java.util) - ทำไม Iterable sit ใน java.lang


12

ตามแผนภาพด้านล่างยกเว้นส่วนต่อประสานส่วนIterableที่เหลือทั้งหมดที่สร้างขึ้น (คลาสอินเตอร์เฟส / คลาส / นามธรรม) จะอยู่ในแพ็คเกจเดียวกันjava.util

ป้อนคำอธิบายรูปภาพที่นี่

 

ทำไมต้องIterableนั่งในjava.langแพ็คเกจ?

หมายเหตุ: ความตั้งใจคือการทำความเข้าใจกับแง่มุมของบรรจุภัณฑ์ของการเขียนโปรแกรมจาวา


สงสัยว่าทำไมนี่คือแท็กjava8 , API ทั้งหมดที่ถามถึงที่นี่เก่ากว่ามาก Iterable ได้รับการแนะนำใน Java เวอร์ชัน 1.5 กรอบการรวบรวมใน 1.2
gnat

คำตอบ:


22

ตามที่อธิบายไว้ในjavadocวัตถุประสงค์ของIterableมันคือเพื่อสนับสนุนไวยากรณ์ภาษาเฉพาะ :

การใช้อินเทอร์เฟซนี้ช่วยให้วัตถุเป็นเป้าหมายของคำสั่ง "foreach"

เช่นนี้มันเป็นของแพคเกจ langซึ่ง

จัดเตรียมคลาสที่เป็นพื้นฐานของการออกแบบภาษาการเขียนโปรแกรม Java


ชั้นเรียนอื่น ๆ ที่แผนภาพเป็นJCFและด้วยเหตุนี้อยู่ในแพคเกจ utilซึ่ง

มีเฟรมเวิร์กคอลเล็กชัน ...


+1 ฉันคิดว่าแม้ว่ามันIteratorควรจะเป็นjava.langเช่นนั้นเนื่องจากIterableเป็น แน่นอนว่ามันต้องมีjava.utilเหตุผลด้านความเข้ากันได้แบบย้อนหลัง (มันถูกนำมาใช้ใน JDK มานานก่อนที่การสร้าง "foreach" จะทำให้มันมีบทบาทในภาษาที่เหมาะสม)
ruakh

@ruakh Iterator สะดวก แต่ก็ถือว่ามีความเฉพาะเจาะจงมากเกินไป (การเลือกวิธีและการตั้งชื่อ) เพื่อไปที่แพ็คเกจ "พื้นฐาน" ลองนึกถึงการแจงนับก่อนหน้าซึ่งในที่สุดกลับกลายเป็นว่าไม่สะดวกอย่างที่คิดไว้ในตอนแรกมันรอบคอบที่จะไม่ไปที่บรรจุภัณฑ์
gnat

ประเด็นของฉันไม่สะดวกสบาย แต่ตอนนี้ภาษาที่เหมาะสมนั้นขึ้นอยู่กับมัน (หมายเหตุว่านอกเหนือจากการพึ่งพาของIterableเกี่ยวกับIterator การjava.langแพคเกจไม่ได้โดยทั่วไปขึ้นอยู่กับชั้นเรียนในjava.util.)
ruakh

@ruakh ฉันเห็น นั่นเป็นจุดที่ดีมากขอบคุณ ฉันสามารถเข้าใจได้ว่าทำไมนักออกแบบ API ต้องการให้ Iterable เปิดเผย "วัตถุที่ทำซ้ำ" แต่วิธีที่พวกเขาเลือกทำสิ่งนี้ไม่รู้สึกสง่างาม
gnat

6

เนื่องจากมีหลายสิ่งที่ใช้อินเตอร์เฟสIterableหรือขยายเป็นอินเตอร์เฟสย่อย

ชั้นเรียนดำเนินการคือ:

  • java.util
    • AbstractCollection
    • AbstractList
    • AbstractQueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • พร้อมกัน
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • DataTruncation
    • ...
  • javax.management
    • AttributeList
  • javax.print.attribute.standard
    • JobStateReasons
    • ...
  • ...

นี่คือรายการใหญ่ และสัมผัสกับแพ็คเกจทุกประเภทที่นั่น

นอกจากนี้คุณต้องการที่จะลดการพึ่งพาแพคเกจวงกลม หากคลาสในแพ็คเกจ A ขึ้นอยู่กับคลาสในแพ็คเกจ B ซึ่งขึ้นอยู่กับคลาสในแพ็คเกจ A แสดงว่าคุณมีการพึ่งพาแบบวงกลม พวกเขาไม่ได้เลวร้ายเสมอไปที่มีอยู่ - แต่พวกเขานำไปสู่การพึ่งพาแบบวงกลมอื่น ๆ และนั่นอาจเป็นสิ่งที่ไม่ดี มันไม่ได้เลวร้ายนัก แต่มันก็เป็นกลิ่นการออกแบบที่บ่งบอกว่าการมีเพศสัมพันธ์ระหว่างสองคลาสหรือแพ็คเกจนั้นแน่นเกินไป มันเป็นจุดเริ่มต้นของหนี้ทางเทคนิคสะสม

วิธีแก้ปัญหานี้คือการพูดว่า "ใช่, Iterable interface เป็นสิ่งที่ขึ้นอยู่กับคลาสและแพ็คเกจที่หลากหลายตลอดทั้งโครงสร้างของ java และ javax มันควรจะอยู่ในฐานของไลบรารีภาษา - java .lang."

และนั่นคือที่ที่คุณจะพบมัน

การอ่านที่เกี่ยวข้อง:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.