Đối với một lớp học mà lĩnh vực hoàn toàn chịu nguyên thủy, ex .:Ghi đè hashCode() - điều này có đủ tốt không?
class Foo
{
int a;
String b;
boolean c;
long d;
boolean equals(Object o)
{
if (this == o) return true;
if (!(o instanceof Foo)) return false;
Foo other = (Foo) o;
return a == other.a && b.equals(other.b) && c == other.c && d = other.d;
}
}
Đây có phải là một cách hợp lý "đủ tốt" để viết hashCode()
?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
Đó là, tôi xây dựng một String
ra khỏi các lĩnh vực tương tự mà equals()
sử dụng, và sau đó chỉ cần sử dụng String#hashCode()
.
Chỉnh sửa: Tôi đã cập nhật câu hỏi của mình để bao gồm trường long
. Làm thế nào nên một long
được xử lý trong hashCode()
? Chỉ cần để nó tràn int
?
Trong khi không hiệu quả khủng khiếp, nó sẽ hoạt động tốt vì bất kỳ hai trường hợp nào có cùng giá trị nội bộ sẽ có cùng mã băm. – Gabe
Nó sẽ làm việc một cách chính xác tôi không biết về vấn đề hiệu suất về nó, nhưng nó chắc chắn sẽ làm việc. Nếu bạn muốn đi xa hơn thì hãy đọc: http://www.ibm.com/developerworks/java/library/j-jtp05273.html – Necronet
Chỉ cần sử dụng [hashonsode] của [commons-lang] (http://commons.apache.org/ lang/api-2.5/org/apache/commons/lang/builder/HashCodeBuilder.html) và không bao giờ phải lo lắng loại điều này –