2011-08-07 8 views
23

Nếu tôi triển khai java.lang.Comparable cho một lớp học, tôi vẫn phải ghi đè phương thức equals()? Hoặc Comparable có hoạt động với equals không?java.lang.Comparable và bằng

Nếu câu trả lời là không thì điều gì sẽ xảy ra nếu một số khác biệt phát sinh? Hãy nói cách tôi gọi hai đối tượng bằng nhau trong phương thức equals() khác với cách tôi đặt hai đối tượng của cùng một lớp bằng nhau trong số compareTo() của số Comparable.

Hơn nữa, nếu tôi triển khai Comparable, tôi có phải ghi đè equals() không?

Trả lời

26

Mặc dù được đề xuất (và khá hợp lý) có a.compareTo(b) == 0 ngụ ý rằng a.equals(b) (và ngược lại), nó là không phải bắt buộc. Comparable được thiết kế để được sử dụng khi thực hiện một đơn đặt hàng trên một loạt các đối tượng, trong khi equals() chỉ là thử nghiệm cho bình đẳng thẳng.

This link có một số thông tin tốt về việc triển khai compareTo đúng cách.

+0

+1 đây là một liên kết đến các chương có hiệu lực của Java có liên quan (xem mục 11) http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD Cảm ơn bạn đã liên kết. Nó (không ngạc nhiên) nói nó tốt hơn tôi! – dlev

+0

@MbyD cảm ơn vì liên kết. Có ổn không khi gọi a.compareTo (b) hoặc so sánh() trực tiếp? – aps

7

Từ Javadoc của java.lang.Comparable:

Nó được khuyến khích mạnh mẽ (dù không bắt buộc) mà orderings tự nhiên phù hợp với chiều sâu.

0

Hãy nói rằng cách tôi nhiệm kỳ hai đối tượng như bình đẳng trong equals() phương pháp khác với cách tôi nhiệm kỳ hai đối tượng của cùng một lớp như bằng nhau trong toCompare() của Comparable?

Nếu bạn làm điều này và bạn đặt các đối tượng đó vào một số được sắp xếp, bộ này sẽ hoạt động không đúng. From the docs on SortedSet:

Lưu ý rằng thứ tự được duy trì bởi một bộ sắp xếp (có hay không một so sánh rõ ràng được cung cấp) phải phù hợp với bằng nếu bộ được sắp xếp là thực hiện một cách chính xác giao diện Set.

Ví dụ, một TreeSet thể (sai lầm) chứa hai đối tượng nơi

a.compareTo(b) != 0 

mặc dù

a.equals(b) == true 
+1

Tất cả các hoạt động 'TreeSet' được thực hiện bằng' compareTo' - vì vậy các đối tượng mà phép so sánh trả về '! = 0' được coi là khác biệt, và các đối tượng mà so sánh trả về' == 0' là giống nhau (và do đó chỉ có phần tử đầu tiên được thêm vào bộ này thực sự được giữ lại). Như Javadoc nói: 'Các hành vi của một tập hợp được sắp xếp được xác định rõ ngay cả khi thứ tự của nó là không phù hợp với bằng; nó không tuân theo hợp đồng chung của giao diện Set.' –