Uyarı, miras ile @Data ek açıklaması lombok'ta / hashCode'a eşittir


105

Başkasından miras alan bir varlığım var. Öte yandan, klişe kodunu azaltmak için lombok projesini kullanıyorum, bu yüzden @Dataek açıklama koyuyorum . @DataDevralma ile açıklama bir sonraki uyarıyı oluşturur:

Eşit / hashCode uygulaması üretiliyor, ancak bu sınıf java.lang.Object öğesini genişletmese bile, süper sınıfa çağrı yapılmadan. Bu kasıtlıysa, @EqualsAndHashCode(callSuper=false)türünüze ekleyin .

O açıklama eklemek için tavsiye edilir @EqualsAndHashCode (callSuper = true)ya @EqualsAndHashCode (callSuper = false)? Eklenmemişse, Hangisi callSuper=falseveya callSuper=true?

Yanıtlar:


125

Varsayılan değer olduğunu false. Bunu belirtmezseniz ve uyarıyı görmezden gelirseniz elde edeceğiniz şey budur.

Evet, @EqualsAndHashCodeek @Dataaçıklamalı sınıflara Object dışında bir şey genişleten bir açıklama eklemeniz önerilir . İhtiyacınız olup olmadığını size söyleyemem trueya da falsebu, sınıf hiyerarşinize bağlıdır ve duruma göre incelenmeniz gerekecek.

Ancak, bir proje veya paket için, lombok.configObject'in doğrudan bir alt sınıfı değilse, süper yöntemleri çağırmak üzere yapılandırabilirsiniz .

lombok.equalsAndHashCode.callSuper = call

Bunun nasıl çalıştığına ilişkin yapılandırma sistemi belgelerine ve desteklenen yapılandırma anahtarlarının @EqualsEndHashCodebelgelerine bakın.

Açıklama: Ben bir lombok geliştiricisiyim.


Benim için çalıştı. Ancak, delombok eklentisinin bu yapılandırma dosyasını alması için, kaynak dizinine değil, java kaynak kök dizinine yerleştirilmesi gerektiğini unutmayın, yani src / main / java içine ve src / main / kaynaklarda değil
user577736

1
@Roel Ben varsayılanın neden yanlış olduğunu merak ediyorum. Tam tersini bekliyordum. Ayrıca, toString () işlevinin varsayılan olarak super çağırmasına eşdeğer bir yol var mı? Görüyorum ki "@ToString (callSuper = true)" yapabiliyorum, ancak böyle bir yapılandırma ayarı göremiyorum. Teşekkürler.
David Siegal

@Data'dan önce veya sonra @EqualsAndHashCode (callSuper = true) eklemem önemli mi?
Anna Klein

@AnnaKlein sipariş önemli değil
dan Carter

47

@EqualsAndHashCode(callSuper=true) uyarıyı çözmelidir.


1
Roel'in önerisinin "lombok.equalsAndHashCode.callSuper = call" yerine her sınıf için bir karar verilmesi gerektiğini düşünmediğim için bu doğru cevap olmalı.
Anna Klein

4
@AnnaKlein Sanmıyorum. Aslında bu cevap bir yorum olmalı, burada yeni bir bilgi yok, bunu sorumda bulabilirsiniz. @EqualsAndHashCodeUyarıyı çözdüğünü biliyordum .
Pau

Aslında kabul edilen cevaba (ve aşağıdaki cevabıma) göre, ek açıklamada 'callSuper = true' veya 'callSuper = false' arasında seçim yapmalısınız.
Adam Wise

28

Asıl soru şudur:

@EqualsAndHashCode (callSuper = true) veya @EqualsAndHashCode (callSuper = false) ek açıklama eklemeniz önerilir mi?

Kabul edilen cevap temelde sadece:

...Bu bağlıdır...

Bunu genişletmek için, @EqualsAndHashCode üzerindeki dokümantasyon, seçilecek sağlam bir kılavuza sahiptir. Özellikle bu, IMHO:

CallSuper'ı true olarak ayarlayarak, üst sınıfınızın eşittir ve hashCode yöntemlerini üretilen yöntemlere dahil edebilirsiniz. HashCode için super.hashCode () sonucu, karma algoritmasına dahil edilir ve forequals, oluşturulan yöntem, süper uygulama nesnede iletilene eşit olmadığını düşünürse yanlış döndürür. Tüm eşittir uygulamalarının bu durumu doğru şekilde ele almadığını unutmayın. Bununla birlikte, lombok tarafından oluşturulan eşitlik uygulamaları bu durumu düzgün bir şekilde ele alır, bu nedenle, eğer lombok tarafından üretilen eşittir yöntemine sahipse süper sınıfınızı güvenli bir şekilde çağırabilirsiniz.

Bunu biraz azaltmak için: Durum bilgisi olmayan bir üst sınıftan miras alıyorsanız veya kendisi @Data ek açıklamasını kullanıyorsa veya "durumu düzgün bir şekilde ele alan" eşitlik / karma uygulamalarına sahipse 'callSuper = true' seçeneğini seçin. - bunu, durum değerlerinin uygun bir karmasını döndürmek olarak yorumluyorum.


CallSuper = false ve callSuper = true arasında nasıl seçim yapılacağını iyi açıklayan yanıtın bu olduğunu düşünüyorum.
prageeth

10

Üst sınıfın üyelerini de karşılaştırmak istiyorsanız, o zaman kullanın @EqualsAndHashCode(callSuper=true). Ancak, yalnızca mevcut sınıftaki alanları karşılaştırmak istiyorsanız @EqualsAndHashCode(callSuper=false), varsayılan seçenek olanı kullanabilirsiniz .

Eğer kullanırsanız Delombok özelliğini farkıntrue bu satıra ayarlandığında oluşturulan eşittir yöntemine eklendiğini görebilirsiniz if (!super.equals(o)) return false;. Üst sınıfta iki nesneyi karşılaştırırken dikkate alınması gereken üyeleriniz varsa, doğru şekilde karşılaştırmak için bunun true olarak ayarlanması gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.