Saya memiliki entitas yang mewarisi dari yang lain. Di sisi lain, saya menggunakan proyek lombok untuk mengurangi kode boilerplate, jadi saya beri @Data
anotasi. Anotasi @Data
dengan pewarisan menghasilkan peringatan berikutnya:
Menghasilkan implementasi sama dengan / hashCode tetapi tanpa panggilan ke superclass, meskipun kelas ini tidak memperluas java.lang.Object. Jika ini disengaja, tambahkan
@EqualsAndHashCode(callSuper=false)
ke tipe Anda.
Apakah sebaiknya menambahkan anotasi @EqualsAndHashCode (callSuper = true)
atau @EqualsAndHashCode (callSuper = false)
? Jika tidak ditambahkan, yang mana callSuper=false
atau callSuper=true
?
@EqualsAndHashCode(callSuper=true)
harus menyelesaikan peringatan tersebut.sumber
@EqualsAndHashCode
menyelesaikan peringatan itu.Pertanyaan asli utamanya adalah:
Jawaban yang diterima pada dasarnya hanya:
Untuk memperluasnya, dokumentasi di @EqualsAndHashCode memiliki beberapa panduan yang solid untuk dipilih. Terutama ini, IMHO:
Untuk sedikit menyaringnya: Pilih 'callSuper = true' jika Anda mewarisi dari superclass yang tidak memiliki informasi status, atau dirinya sendiri menggunakan anotasi @Data, atau memiliki implementasi sama dengan / hash yang "menangani situasi dengan benar" - yang saya tafsirkan sebagai mengembalikan hash yang tepat dari nilai negara bagian.
sumber
Jika Anda ingin membandingkan anggota superclass juga, gunakan
@EqualsAndHashCode(callSuper=true)
. Namun, jika Anda hanya ingin membandingkan bidang di kelas saat ini, Anda dapat menggunakan@EqualsAndHashCode(callSuper=false)
yang merupakan opsi default .Jika Anda menggunakan Delombok -feature Anda dapat melihat bahwa perbedaan adalah bahwa ketika diatur ke
true
baris ini ditambahkan ke dihasilkan equals metodeif (!super.equals(o)) return false;
. Jika Anda memiliki anggota dalam superclass yang harus diperhitungkan saat membandingkan dua objek, maka itu harus disetel ke true untuk membandingkan dengan benar.sumber