Pembangun commons / lang sangat bagus dan saya telah menggunakan mereka selama bertahun-tahun tanpa overhead kinerja yang nyata (dengan dan tanpa hibernasi). Tetapi seperti yang ditulis Alain, cara Jambu bahkan lebih baik:
Inilah contoh Kacang:
public class Bean{
private String name;
private int length;
private List<Bean> children;
}
Inilah equals () dan hashCode () diimplementasikan dengan Commons / Lang:
@Override
public int hashCode(){
return new HashCodeBuilder()
.append(name)
.append(length)
.append(children)
.toHashCode();
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return new EqualsBuilder()
.append(name, other.name)
.append(length, other.length)
.append(children, other.children)
.isEquals();
} else{
return false;
}
}
dan di sini dengan Java 7 atau lebih tinggi (terinspirasi oleh Guava):
@Override
public int hashCode(){
return Objects.hash(name, length, children);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return Objects.equals(name, other.name)
&& length == other.length // special handling for primitives
&& Objects.equals(children, other.children);
} else{
return false;
}
}
Catatan: kode ini awalnya merujuk Guava, tetapi seperti yang ditunjukkan oleh komentar, fungsi ini telah diperkenalkan di JDK, jadi Guava tidak lagi diperlukan.
Seperti yang Anda lihat, versi Guava / JDK lebih pendek dan menghindari objek pembantu yang berlebihan. Dalam kasus yang sama, itu bahkan memungkinkan untuk hubungan pendek evaluasi jika Object.equals()
panggilan sebelumnya mengembalikan false (agar adil: commons / lang memiliki ObjectUtils.equals(obj1, obj2)
metode dengan semantik identik yang dapat digunakan alih-alih EqualsBuilder
memungkinkan hubungan pendek seperti di atas).
Jadi: ya, pembangun lang commons lebih disukai daripada yang dibangun secara manual equals()
dan hashCode()
metode (atau monster mengerikan yang Eclipse akan hasilkan untuk Anda), tetapi versi Java 7+ / Guava bahkan lebih baik.
Dan catatan tentang Hibernate:
hati-hati menggunakan koleksi malas dalam implementasi equals (), hashCode (), dan toString () Anda. Itu akan gagal total jika Anda tidak memiliki Sesi terbuka.
Catatan (kira-kira sama dengan ()):
a) di kedua versi sama dengan () di atas, Anda mungkin ingin menggunakan salah satu atau kedua pintasan ini juga:
@Override
public boolean equals(final Object obj){
if(obj == this) return true; // test for reference equality
if(obj == null) return false; // test for null
// continue as above
b) tergantung pada interpretasi Anda terhadap kontrak equals (), Anda juga dapat mengubah baris
if(obj instanceof Bean){
untuk
// make sure you run a null check before this
if(obj.getClass() == getClass()){
Jika Anda menggunakan versi kedua, Anda mungkin juga ingin memanggil super(equals())
di dalam equals()
metode Anda . Pendapat berbeda di sini, topiknya dibahas dalam pertanyaan ini:
cara yang benar untuk memasukkan superclass ke dalam implementasi Guava Objects.hashcode ()?
(Meskipun ini tentang hashCode()
, hal yang sama berlaku untuk equals()
)
Catatan (terinspirasi oleh Komentar dari kayahr )
Objects.hashCode(..)
(seperti yang mendasarinya Arrays.hashCode(...)
) mungkin berkinerja buruk jika Anda memiliki banyak bidang primitif. Dalam kasus seperti itu, EqualsBuilder
mungkin sebenarnya merupakan solusi yang lebih baik.
reflectionEquals
danreflectionHashcode
fungsi; kinerja adalah pembunuh mutlak.