2012-10-12 42 views
11

Lớp Collections có một số phương pháp helper tĩnh để cung cấp chỉ đọc quan điểm của loại bộ sưu tập khác nhau, chẳng hạn như unmodifiableSet(), unmodifiableList(), vv Đối với các đối tượng xem, hashCode()equals() các phương thức chuyển tiếp cuộc gọi đến bộ sưu tập cơ bản ... Với một ngoại lệ lẻ: unmodifiableCollection().hashCode và equals cho Collections.unmodifiableCollection()

Các javadoc explicitly states:

Bộ sưu tập trở lại làm không vượt qua hashCode và equals hoạt động thông qua các bộ sưu tập ủng hộ, nhưng dựa vào equalshashCode phương pháp Object 's. Điều này là cần thiết để bảo tồn các hợp đồng của các hoạt động này trong trường hợp bộ sưu tập sao lưu là tập hợp hoặc danh sách.

Câu hỏi của tôi: wtf là cái này nói về ?? Nếu bộ sưu tập sao lưu là tập hợp hoặc danh sách, tôi mong đợi hành vi phù hợp với unmodifiableSet()unmodifiableList(). Điều đó sẽ vi phạm các hợp đồng hashCode/equals như thế nào?

Trả lời

14

Từ javadoc cho Bộ sưu tập:

Hợp đồng chung của các quốc gia phương pháp Object.equals rằng bằng phải đối xứng (nói cách khác, a.equals (b) khi và chỉ khi b. bằng (a)). Các hợp đồng cho List.equals và Set.equals chỉ ra rằng các danh sách chỉ bằng các danh sách khác và đặt thành các bộ khác. Do đó, phương thức tùy chỉnh cho lớp thu thập thực hiện không phải giao diện Danh sách cũng như Đặt phải trả về false khi bộ sưu tập này là so với bất kỳ danh sách hoặc bộ nào. (Theo logic đó, nó không thể viết một lớp mà thực hiện một cách chính xác cả Set và Danh mục giao diện.)

Một UnmodifiableList là một UnmodifiableCollection, nhưng điều này cũng không đúng sự thật ngược lại - một UnmodifiableCollection kết thúc tốt đẹp một số Listkhông an UnmodifiableList. Vì vậy, nếu bạn so sánh một số UnmodifiableCollection kết thúc tốt đẹp Danh sách a với một số UnmodifiableList kết thúc tốt đẹp cùng một Danh sách a thì hai trình bao bọc không được bằng nhau. Nếu bạn vừa chuyển qua danh sách được bọc, chúng sẽ bằng nhau.

Các vấn đề liên quan