Cấu trúc đóng gói của các bộ sưu tập Java (java.util) - tại sao Iterable ngồi trong java.lang?


12

Theo sơ đồ dưới đây, ngoại trừ giao diện Iterable, tất cả các cấu trúc còn lại (giao diện / lớp / lớp trừu tượng) nằm trong cùng một góijava.util

nhập mô tả hình ảnh ở đây

 

Tại sao Iterablengồi trong java.langgói?

Lưu ý: Mục đích là để hiểu khía cạnh đóng gói của lập trình java.


tự hỏi tại sao điều này được gắn thẻ java8 , tất cả các API được hỏi về đây đều cũ hơn nhiều. Iterable được giới thiệu trong phiên bản Java 1.5, khung bộ sưu tập trong 1.2
gnat

Câu trả lời:


22

Như đã giải thích trong javadoc , mục đích của Iterablenó là hỗ trợ cú pháp ngôn ngữ cụ thể :

Việc thực hiện giao diện này cho phép một đối tượng trở thành mục tiêu của câu lệnh "foreach"

Như vậy, nó thuộc về gói lang , mà

Cung cấp các lớp cơ bản để thiết kế ngôn ngữ lập trình Java.


Các lớp khác vào sơ đồ thuộc về JCF và do đó, đang trong util gói

Chứa khung bộ sưu tập ...


+1. Tôi nghĩ, mặc dù, đó là Iteratorlý tưởng cũng nên được java.lang, vì Iterablelà. Tất nhiên, nó phải nằm trong java.utilcác lý do tương thích ngược (nó đã được giới thiệu trong JDK từ lâu trước khi cấu trúc "foreach" tạo cho nó một vai trò trong ngôn ngữ phù hợp).
ruakh

@ruakh Iterator là thuận tiện, nhưng có lẽ được coi là quá cụ thể (lựa chọn phương pháp và đặt tên) để đi đến gói "cơ bản". Hãy nghĩ về Enumulation tiền nhiệm của nó , mà cuối cùng hóa ra không thuận tiện như suy nghĩ ban đầu, thật khôn ngoan khi nó không đi đến gói lang
gnat

Quan điểm của tôi không phải là nó tiện lợi, mà là ngôn ngữ phù hợp bây giờ phụ thuộc vào nó. (Lưu ý rằng, ngoài sự phụ thuộc Iterablevào Iterator , java.langgói thường không phụ thuộc vào các lớp trong java.util.)
ruakh

@ruakh Mình thấy. Đó là một điểm rất tốt, cảm ơn. Tôi có thể hiểu tại sao các nhà thiết kế API muốn Iterable thể hiện "một đối tượng thực hiện phép lặp" nhưng cách họ chọn để làm điều này không mang lại cảm giác thanh lịch
gnat

6

Bởi vì rất nhiều thứ thực hiện giao diện Iterable hoặc mở rộng nó như một giao diện phụ.

Các lớp thực hiện là:

  • java.util
    • Tóm tắt
    • Tóm tắt
    • Tóm tắt
    • Tóm tắtSequentialList
    • Tóm tắt
    • ...
    • đồng thời
      • ArrayBlockingQueue
      • Đồng thờiLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServiceSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • Truncation dữ liệu
    • ...
  • javax.man quản lý
    • Danh sách thuộc tính
  • javax.print.attribution.st Chuẩn
    • Lý do công việc
    • ...
  • ...

Đây là một danh sách rất lớn. Và nó chạm vào tất cả các loại gói ngoài kia.

Hơn nữa, bạn muốn giảm thiểu phụ thuộc gói tròn . Nếu một lớp trong gói A phụ thuộc vào một lớp trong gói B phụ thuộc vào một lớp trong gói A, bạn đã có một phụ thuộc vòng tròn. Chúng không phải lúc nào cũng xấu khi chúng tồn tại - nhưng chúng dẫn đến sự phụ thuộc vòng tròn khác và đó có thể là một điều xấu. Bản thân nó không tệ, nhưng nó là một mùi thiết kế chỉ ra rằng khớp nối giữa hai lớp hoặc gói quá chặt chẽ. Đó là sự khởi đầu của tích lũy nợ kỹ thuật.

Giải pháp cho vấn đề này là nói "vâng, giao diện Iterable là thứ được phụ thuộc vào rất nhiều lớp và gói trong toàn bộ cấu trúc java và javax. Nó phải nằm trong hầu hết các thư viện ngôn ngữ - java .lang. "

Và đó là nơi bạn sẽ tìm thấy nó.

Đọc liên quan:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.