2009-10-11 32 views
12

Khi viết các lớp của riêng mình, bạn có cần phải ghi đè lên equals(Object o) không?Chúng ta có nên luôn ghi đè bằng?

Nếu không, sẽ tự động kiểm tra xem tất cả các trường có giống nhau không? Hay nó chỉ kiểm tra nếu hai biến trỏ đến cùng một đối tượng?

Trả lời

16

Nếu một người đang viết một lớp học sẽ có đối tượng của nó được so sánh theo một cách nào đó, thì người ta nên ghi đè các phương pháp equalshashCode.

Không cung cấp một equals phương pháp rõ ràng sẽ dẫn đến thừa hưởng hành vi của các phương pháp equals từ lớp cha, và trong trường hợp của lớp cha là lớp Object, sau đó nó sẽ là hành vi setforth trong Specification Java API cho Object lớp học.

Hợp đồng chung để cung cấp phương thức equals có thể được tìm thấy trong tài liệu cho lớp Object, cụ thể là tài liệu của các phương pháp equalshashCode.

4

Phương thức equals cho lớp Object thực hiện mối quan hệ tương đương có thể phân biệt đối xử nhất trên các đối tượng; tức là, đối với bất kỳ giá trị tham chiếu không null và y, phương thức này trả về true nếu và chỉ khi x và y tham chiếu đến cùng một đối tượng (x == y có giá trị đúng).

Để kiểm tra xem hai đối tượng có bằng nhau theo nghĩa tương đương hay không (có chứa cùng thông tin), bạn phải ghi đè phương thức equals(). Bạn nên luôn ghi đè phương thức equals() nếu toán tử không phù hợp với lớp học. Lưu ý rằng nó thường là cần thiết để ghi đè lên phương thức hashCode bất cứ khi nào phương pháp này được ghi đè, để duy trì hợp đồng chung cho phương thức hashCode, trong đó nói rằng các đối tượng bằng nhau phải có các mã băm bằng nhau.

5

Chỉ ghi đè equals() nếu có ý nghĩa. Nhưng rõ ràng nếu bạn ghi đè equals() bạn cần đảm bảo rằng hợp đồng hashcode() không bị hỏng, có nghĩa là nếu hai đối tượng bằng nhau, chúng phải có cùng mã băm.

Khi nào điều đó hợp lý? Khi Object.equals() không đủ. Đó là phương pháp cơ bản đi xuống đến danh tính tham khảo, có nghĩa là hai đối tượng đều cùng một đối tượng như vậy:

số là một ví dụ rõ ràng khi nó có ý nghĩa vì Integer(10) phải bằng Intger(10) khác.

Ví dụ khác có thể là khi bạn đại diện cho bản ghi cơ sở dữ liệu. Giả sử bạn có Hồ sơ học sinh với một số nguyên duy nhất, sau đó nó có thể được thực hiện đầy đủ bằng để chỉ đơn giản là so sánh các lĩnh vực ID.

2

Mặc dù bạn không nên dựa vào IDE, Eclipse cung cấp chức năng đóng hộp này bằng cách nhấn alt + shift + s và chọn tùy chọn trình đơn bằng và hashCode. Ngoài ra còn có một tùy chọn toString. Effective Java bởi Josh Bloch có thông tin tốt về chủ đề này. Liên kết sẽ đưa bạn đến chương được lưu trữ trên Google Sách thảo luận về chủ đề này.

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