Cảnh báo bằng / mã băm trên lombok chú thích @Data với tính kế thừa


103

Tôi có một thực thể kế thừa từ cái khác. Mặt khác, tôi đang sử dụng dự án lombok để giảm mã viết sẵn, vì vậy tôi đặt @Datachú thích. Chú thích @Datavới kế thừa tạo ra cảnh báo tiếp theo:

Tạo triển khai bằng / mã băm nhưng không có lệnh gọi đến lớp cha, mặc dù lớp này không mở rộng java.lang.Object. Nếu điều này là cố ý, hãy thêm @EqualsAndHashCode(callSuper=false)vào loại của bạn.

Có nên thêm chú thích @EqualsAndHashCode (callSuper = true)hay @EqualsAndHashCode (callSuper = false)không? Nếu nó không được thêm vào, nó là cái nào callSuper=falsehoặc callSuper=true?

Câu trả lời:


125

Các giá trị mặc địnhfalse. Đó là một trong những bạn nhận được nếu bạn không chỉ định nó và bỏ qua cảnh báo.

Có, bạn nên thêm @EqualsAndHashCodechú thích vào các @Datalớp chú thích mở rộng một thứ khác ngoài Đối tượng. Tôi không thể cho bạn biết bạn có cần truehay không false, điều đó phụ thuộc vào hệ thống phân cấp lớp của bạn và sẽ cần được kiểm tra theo từng trường hợp.

Tuy nhiên, đối với một dự án hoặc gói, bạn có thể cấu hình lombok.configđể gọi các siêu phương thức nếu nó không phải là một lớp con trực tiếp của Đối tượng.

lombok.equalsAndHashCode.callSuper = call

Xem tài liệu hệ thống cấu hình về cách thức hoạt động và @EqualsEndHashCodetài liệu về các khóa cấu hình được hỗ trợ.

Tiết lộ: Tôi là một nhà phát triển lombok.


Đã làm cho tôi. Nhưng chỉ cần lưu ý rằng để plugin delombok chọn tệp cấu hình này, nó phải được đặt trong thư mục gốc nguồn java, không phải trong thư mục tài nguyên, tức là trong src / main / java và không phải trong src / main / resources
user577736

1
@Roel Tôi đang tự hỏi tại sao mặc định là sai. Tôi đã mong đợi điều ngược lại. Ngoài ra, có cách nào tương đương để lấy toString () gọi super theo mặc định không? Tôi thấy tôi có thể thực hiện "@ToString (callSuper = true)", nhưng không thấy bất kỳ cài đặt cấu hình nào như vậy. Cảm ơn.
David Siegal

Có vấn đề gì không nếu tôi thêm @EqualsAndHashCode (callSuper = true) trước hoặc sau @Data?
Anna Klein

@AnnaKlein thứ tự không quan trọng
dan carter

47

@EqualsAndHashCode(callSuper=true) nên giải quyết cảnh báo.


1
Đây phải là câu trả lời được nhiều người biết đến vì tôi không nghĩ rằng đề xuất của Roel nên được thực hiện "lombok.equalsAndHashCode.callSuper = call" thay vào đó nên đưa ra quyết định cho mỗi lớp.
Anna Klein

4
@AnnaKlein Tôi không nghĩ vậy. Trong thực tế, câu trả lời này nên là một bình luận, không có thông tin mới ở đây, bạn có thể tìm thấy điều đó trong câu hỏi của tôi. Tôi đã biết @EqualsAndHashCodegiải quyết cảnh báo.
Pau

Trên thực tế, theo câu trả lời được chấp nhận (và câu trả lời của tôi bên dưới), bạn nên chọn giữa 'callSuper = true' hoặc 'callSuper = false' trong chú thích.
Adam Wise

27

Câu hỏi ban đầu chính là:

Có nên thêm chú thích @EqualsAndHashCode (callSuper = true) hoặc @EqualsAndHashCode (callSuper = false) không?

Câu trả lời được chấp nhận về cơ bản chỉ là:

...mà phụ thuộc...

Để mở rộng điều đó, tài liệu về @EqualsAndHashCode có một số hướng dẫn chắc chắn về cách chọn. Đặc biệt là điều này, IMHO:

Bằng cách đặt callSuper thành true, bạn có thể bao gồm các phương thức bằng và mã băm của lớp cha của bạn trong các phương thức đã tạo. Đối với hashCode, kết quả của super.hashCode () được bao gồm trong thuật toán băm và các hàm trước, phương thức được tạo sẽ trả về false nếu siêu triển khai cho rằng nó không bằng đối tượng được truyền vào. Lưu ý rằng không phải tất cả các triển khai bằng đều xử lý tình huống này đúng cách. Tuy nhiên, các triển khai bằng do lombok tạo ra xử lý tình huống này đúng cách, vì vậy bạn có thể an toàn gọi lớp siêu của mình bằng bằng nếu nó cũng có phương thức bằng do lombok tạo.

Để chắt lọc điều này một chút: Chọn 'callSuper = true' nếu bạn đang kế thừa từ lớp cha không có thông tin trạng thái hoặc chính nó đang sử dụng chú thích @Data hoặc có triển khai bằng / băm "xử lý tình huống đúng cách" - mà tôi giải thích có nghĩa là trả về một băm thích hợp của các giá trị trạng thái.


Tôi nghĩ đây là câu trả lời giải thích rõ cách lựa chọn giữa callSuper = false và callSuper = true.
prageeth

10

Nếu bạn muốn so sánh các thành viên của lớp cha, thì hãy sử dụng @EqualsAndHashCode(callSuper=true). Tuy nhiên, nếu bạn chỉ muốn so sánh các trường trong lớp hiện tại, bạn có thể sử dụng tùy chọn @EqualsAndHashCode(callSuper=false)này là tùy chọn mặc định .

Nếu bạn sử dụng tính năng Delombok, bạn có thể thấy rằng sự khác biệt là khi đặt thành truedòng này sẽ được thêm vào phương thức bằng được tạo if (!super.equals(o)) return false;. Nếu bạn có các thành viên trong lớp cha cần được tính đến khi so sánh hai đối tượng, thì nó phải được đặt thành true để so sánh chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.