คำเตือนเท่ากับ / hashCode บน @Data annotation lombok พร้อมการสืบทอด


108

ฉันมีเอนทิตีที่สืบทอดมาจากอื่น ๆ ในทางกลับกันฉันใช้โครงการลอมบอกเพื่อลดรหัสสำเร็จรูปดังนั้นฉันจึงใส่@Dataคำอธิบายประกอบ คำอธิบายประกอบที่@Dataมีการสืบทอดจะสร้างคำเตือนถัดไป:

การสร้างการใช้งานเท่ากับ / hashCode แต่ไม่มีการเรียกใช้ superclass แม้ว่าคลาสนี้จะไม่ขยาย java.lang.Object หากเป็นความตั้งใจให้เพิ่ม@EqualsAndHashCode(callSuper=false)ในประเภทของคุณ

ขอแนะนำให้เพิ่มคำอธิบายประกอบ@EqualsAndHashCode (callSuper = true)หรือ@EqualsAndHashCode (callSuper = false)? ถ้าไม่ได้เพิ่มมันคืออันไหนcallSuper=falseหรือcallSuper=true?

คำตอบ:


128

ค่าเริ่มต้นfalseคือ นั่นคือสิ่งที่คุณจะได้รับหากคุณไม่ระบุและเพิกเฉยต่อคำเตือน

ใช่ขอแนะนำให้เพิ่ม@EqualsAndHashCodeคำอธิบายประกอบใน@Dataคลาสที่มีคำอธิบายประกอบที่ขยายอย่างอื่นที่ไม่ใช่ Object ฉันไม่สามารถบอกคุณได้ว่าคุณต้องการtrueหรือfalseขึ้นอยู่กับลำดับชั้นของชั้นเรียนของคุณและจะต้องได้รับการตรวจสอบเป็นกรณี ๆ ไป

อย่างไรก็ตามสำหรับโปรเจ็กต์หรือแพ็กเกจคุณสามารถกำหนดค่าlombok.configเพื่อเรียกใช้ซุปเปอร์เมธอดได้หากไม่ใช่คลาสย่อยโดยตรงของอ็อบเจ็กต์

lombok.equalsAndHashCode.callSuper = call

ดูเอกสารระบบการกำหนดค่าเกี่ยวกับวิธีการทำงานและ@EqualsEndHashCodeเอกสารสำหรับคีย์การกำหนดค่าที่รองรับ

การเปิดเผยข้อมูล: ฉันเป็นผู้พัฒนาลอมบอก


ทำงานให้ฉัน แต่โปรดทราบว่าสำหรับปลั๊กอิน delombok ในการเลือกไฟล์กำหนดค่านี้ควรวางไว้ในไดเร็กทอรีรากของแหล่ง java ไม่ใช่ในไดเรกทอรีทรัพยากรเช่นใน src / main / java และไม่อยู่ใน src / main / resources
user577736

1
@Roel ฉันสงสัยว่าทำไมค่าเริ่มต้นจึงเป็นเท็จ ฉันคาดว่าจะตรงกันข้าม นอกจากนี้ยังมีวิธีที่เทียบเท่ากันในการเข้าถึง toString () เพื่อเรียก super ตามค่าเริ่มต้นหรือไม่ ฉันเห็นว่าฉันทำได้ "@ToString (callSuper = true)" แต่ไม่เห็นการตั้งค่าดังกล่าว ขอบคุณ.
David Siegal

มันสำคัญหรือไม่ว่าฉันจะเพิ่ม @EqualsAndHashCode (callSuper = true) ก่อนหรือหลัง @Data
Anna Klein

@AnnaKlein คำสั่งไม่สำคัญ
dan carter

48

@EqualsAndHashCode(callSuper=true) ควรแก้ไขคำเตือน


1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากฉันไม่คิดว่าควรทำข้อเสนอแนะของ Roel "lombok.equalsAndHashCode.callSuper = call" แทนการตัดสินใจสำหรับแต่ละคลาส
Anna Klein

4
@AnnaKlein ฉันไม่คิดอย่างนั้น อันที่จริงคำตอบนี้ควรเป็นความคิดเห็นไม่มีข้อมูลใหม่ที่นี่คุณจะพบสิ่งนั้นในคำถามของฉัน ฉันรู้ว่า@EqualsAndHashCodeจะแก้ไขคำเตือน
โป

จริงๆแล้วสำหรับคำตอบที่ยอมรับ (และคำตอบของฉันด้านล่าง) คุณควรเลือกระหว่าง 'callSuper = true' หรือ 'callSuper = false' ในคำอธิบายประกอบ
Adam Wise

32

คำถามดั้งเดิมหลักคือ:

แนะนำให้เพิ่มคำอธิบายประกอบ @EqualsAndHashCode (callSuper = true) หรือ @EqualsAndHashCode (callSuper = false) หรือไม่

คำตอบที่ยอมรับโดยทั่วไปมีเพียง:

... ขึ้นอยู่กับ ...

หากต้องการขยายเพิ่มเติมเอกสารเกี่ยวกับ@EqualsAndHashCodeมีคำแนะนำที่ชัดเจนในการเลือก โดยเฉพาะสิ่งนี้ IMHO:

ด้วยการตั้งค่า callSuper เป็น true คุณสามารถรวมเมธอด equals และ hashCode ของ superclass ในเมธอดที่สร้างขึ้น สำหรับ hashCode ผลลัพธ์ของ super.hashCode () จะรวมอยู่ในอัลกอริทึมแฮชและ forequals เมธอดที่สร้างขึ้นจะส่งคืนเท็จหากการใช้งานขั้นสูงคิดว่าไม่เท่ากับการส่งผ่านในอ็อบเจ็กต์ โปรดทราบว่าการใช้งานสมการทั้งหมดไม่สามารถจัดการสถานการณ์นี้ได้อย่างเหมาะสม อย่างไรก็ตามการใช้งานสมการที่ลอมบ็อกสร้างขึ้นจะจัดการกับสถานการณ์นี้ได้อย่างเหมาะสมดังนั้นคุณสามารถเรียกซูเปอร์คลาสของคุณได้อย่างปลอดภัยหากมีวิธีการเท่ากับลอมบ็อกที่สร้างขึ้น

หากต้องการกลั่นกรองสิ่งนี้ลงเล็กน้อย: เลือก 'callSuper = true' หากคุณรับช่วงจากซูเปอร์คลาสที่ไม่มีข้อมูลสถานะหรือตัวเองกำลังใช้คำอธิบายประกอบ @Data หรือมีการใช้ equals / hash ที่ "จัดการกับสถานการณ์อย่างเหมาะสม" - ซึ่งฉันตีความหมายถึงการส่งคืนค่าแฮชที่เหมาะสมของค่าสถานะ


ฉันคิดว่านี่เป็นคำตอบที่อธิบายถึงวิธีการเลือกระหว่าง callSuper = false และ callSuper = true
prageeth

ฉันเห็นด้วย. คำอธิบายนี้เป็นประโยชน์จริงๆ
Kira Resari

11

หากคุณต้องการเปรียบเทียบสมาชิกของ superclass @EqualsAndHashCode(callSuper=true)ได้เป็นอย่างดีจากนั้นใช้ อย่างไรก็ตามหากคุณต้องการเปรียบเทียบเฉพาะฟิลด์ในคลาสปัจจุบันที่คุณสามารถใช้ได้@EqualsAndHashCode(callSuper=false)ซึ่งเป็นตัวเลือกเริ่มต้น

ถ้าคุณใช้Delombok -feature คุณจะเห็นว่าแตกต่างกันคือเมื่อตั้งค่าtrueบรรทัดนี้จะถูกเพิ่มเข้าไปที่สร้างขึ้นเท่ากับif (!super.equals(o)) return false;วิธีการ หากคุณมีสมาชิกในซูเปอร์คลาสที่ควรนำมาพิจารณาเมื่อเปรียบเทียบวัตถุสองชิ้นคุณจะต้องตั้งค่าเป็นจริงเพื่อเปรียบเทียบได้อย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.