2011-10-18 13 views
6

Nếu chỉ có một số lĩnh vực của một đối tượng đại diện cho nhà nước thực tế, tôi cho rằng những thể bỏ qua khi trọng equalshashCode ...Tiềm năng tiềm ẩn khi bỏ qua một số trường bằng bằng/hashCode?

tôi nhận được một cảm giác khó chịu về điều này tuy nhiên, và muốn hỏi,

  1. Đây có phải là thông lệ phổ biến không?
  2. Có bất kỳ cạm bẫy tiềm năng nào với phương pháp này không?
  3. Có bất kỳ tài liệu hoặc hướng dẫn nào khi bỏ qua một số trường trong equals/hashCode không?

Trong trường hợp cụ thể của tôi, tôi đang khám phá một không gian trạng thái của sự cố. Tôi muốn giữ một bộ băm của các quốc gia được truy cập, nhưng tôi cũng đang xem xét bao gồm đường dẫn dẫn đến trạng thái. Rõ ràng, hai trạng thái bằng nhau, mặc dù chúng được tìm thấy thông qua các đường dẫn khác nhau.

Trả lời

3

Điều này được dựa trên cách bạn xem xét tính duy nhất của một đối tượng nhất định. Nếu nó có khóa chính (khóa duy nhất), thì chỉ sử dụng thuộc tính đó là đủ.

Nếu bạn cho rằng tính duy nhất là sự kết hợp của 10 thuộc tính khác nhau, thì hãy sử dụng tất cả 10 thuộc tính trong bằng.

Sau đó chỉ sử dụng các thuộc tính bạn đã sử dụng bằng để tạo mã băm vì cùng một đối tượng sẽ tạo cùng mã băm.

Việc chọn (các) thuộc tính cho bằng và mã băm là cách bạn xác định tính duy nhất của một đối tượng nhất định.

  • Đây có phải là thực tế phổ biến không? Có

  • Có bất kỳ cạm bẫy tiềm ẩn nào với phương pháp này không? Không

  • Có bất kỳ tài liệu hoặc hướng dẫn nào khi nói đến bỏ qua một số trường bằng bằng/hashCode không?

    "Phương thức tương đương cho lớp Object thực hiện phân biệt đối xử nhất trên đối tượng;"

Đây là từ lớp đối tượng Javadoc. Nhưng với tư cách là tác giả của lớp, bạn biết tính duy nhất được định nghĩa như thế nào.

+0

Như bạn đã đề cập, bạn KHÔNG bao gồm "đường dẫn" trong bằng hoặc hashCode() –

+0

Tôi thích câu trả lời này, nhưng bạn phần nào tránh ba câu hỏi của tôi :-) – aioobe

+0

trả lời câu hỏi của bạn. –

2

Cuối cùng, "bằng" có nghĩa là ý bạn muốn nó có ý nghĩa gì. Có hạn chế rằng các giá trị "bằng nhau" phải trả lại cùng một mã băm, và, tất nhiên, nếu được trình bày với hai địa chỉ giống nhau "bằng" phải trả về giá trị true. Nhưng bạn có thể, ví dụ, có một "bằng" so sánh nội dung của hai trang web (bỏ qua vấn đề lặp lại cho nonce), và, mặc dù các URL khác nhau, nói "bằng" nếu nội dung trang khớp với một số đường.

0

Tài liệu/hướng dẫn tốt nhất mà tôi đã thấy để ghi đè các phương pháp trên Object nằm trong số Effective Java của Josh Bloch. Nó có toàn bộ chương về "Phương thức chung cho tất cả các đối tượng" bao gồm các phần về "Tuân theo hợp đồng chung khi ghi đè bằng" và "Luôn ghi đè mã băm khi bạn ghi đè bằng". Nó mô tả chi tiết những điều bạn nên cân nhắc khi ghi đè hai phương pháp này. Tôi sẽ không trả lời trực tiếp; cuốn sách chắc chắn đáng giá cho mọi nhà phát triển Java.