2012-04-09 38 views
6

Tôi có mã bên dưới ghi đè bằng phương thức equals() và hashcode().Getters có thể được sử dụng trong bằng và hashcode?

public boolean equals(Object obj) 
{ 
    if (obj == null) 
    return false; 
    if (!(obj instanceof Name)) 
    return false; 
    Name name = (Name) obj; 
    return this.name.equals(name.name); 
} 

public int hashCode() 
{ 
    return name.hashCode(); 
} 

đây tôi có thể thay thế dưới 2 dòng:

return this.name.equals(name.name); 
return name.hashCode(); 

với

return this.getName().equals(name.getName()); 
return getName().hashCode(); 

tôi có nghĩa là thay vì sử dụng các thuộc tính tôi có thể trực tiếp sử dụng thu khí bên trong bằng và phương pháp hashcode?

Cảm ơn!

+0

và tại sao không?:) –

+0

có, Không có vấn đề gì. – MJM

+0

có. Bạn chỉ có thể không sử dụng setters hoặc các lĩnh vực có thể được sửa đổi khi đối tượng là trong một bộ sưu tập. –

Trả lời

1

Bạn có thể, nhưng tại sao bạn? Tùy chọn A: trình biên dịch inlines rằng, vì vậy bạn kết thúc với một tham chiếu đến trường anyway. Tùy chọn B: Trình biên dịch không trực tuyến cuộc gọi, tức là bạn đã giới thiệu một cuộc gọi phương thức bổ sung.

Ngoài ra còn có ý nghĩa đối với mức độ dễ đọc - nếu trường name có thể truy cập trực tiếp trong lớp học, tại sao không trực tiếp tham khảo? Tôi thấy điều này dễ đọc hơn, nhưng một số người thấy nó không phù hợp.

+0

Là một lưu ý nhỏ. Nếu bạn sử dụng Mokito, và giả lập một trong những getters được sử dụng trong bằng và phương pháp equals của bạn là cuối cùng bạn sẽ đi đến địa ngục vòng lặp vô hạn. Mokito sử dụng bằng nội bộ để giả lập các lĩnh vực của bạn. Bình thường nó sẽ ghi đè bạn bằng, nhưng nếu nó được đánh dấu là cuối cùng bạn nhận được StackoverflowError – Lori

3

chắc chắn rằng bạn có thể sử dụng này,

hashcode()equals() là phương pháp thực địa, Họ có thể truy cập các thành viên tư nhân trực tiếp, nhưng những gì nếu có một số logic được bọc trong phương pháp accessor, vì vậy nó luôn luôn là an toàn để truy cập các trường sử dụng phương thức truy cập

0

Có, tại sao bạn không thể?

Trong tương lai, với những thứ như thế này, tôi khuyên bạn nên thử xem.

0

Có thể. Tại sao không? Bạn nghi ngờ gì?

1

Có, tôi khuyên bạn nên sử dụng getters trong việc thực hiện equals() & hashCode(). Và theo hiểu biết tốt nhất của tôi, điều này sẽ không làm hại bạn theo bất kỳ cách nào.

Việc triển khai equals() mà không có getters sẽ không cung cấp cho bạn kết quả chính xác khi bạn so sánh hai đối tượng được ủy quyền.

Ví dụ: Nếu bạn cố gắng so sánh hai đối tượng proxy được trả về bởi dao ngủ đông cơ bản của bạn, bạn sẽ không bao giờ nhận đúng từ phương pháp equals() của bạn, mặc dù họ đang ở cùng một đối tượng.

Cập nhật

phương pháp sử dụng getter thay vì truy cập trực tiếp. Điều này là do đối tượng đối tượng được truyền như thể khác có thể là đối tượng proxy, không phải là phiên bản thực tế. Để khởi tạo proxy này, bạn cần truy cập nó bằng phương thức getter .

Đây là trích đoạn từ Hiệu quả Java. Kiểm tra this để biết thêm thông tin.

+0

Tôi biết đây là câu hỏi cũ để trả lời, nhưng tôi chắc chắn điều này sẽ giúp một số người làm việc với proxy. – Diablo

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