SORU
18 ŞUBAT 2011, Cuma


Apache Commons/hashCode builder eşittir

İnsanlar burada kullanma hakkında ne düşünüyorum biliyor musun, merak ediyorum org.apache.commons.lang.builder EqualsBuilder/HashCodeBuilder uygulama içinequals/hashCodeBu? Kendin yazdığın daha iyi bir uygulama olur mu? Peki Hazırda Beklet ile mi oynuyor? Ne düşünüyorsun?

CEVAP
18 ŞUBAT 2011, Cuma


Commons/lang inşaatçılar büyük ve göze çarpan performans yükü (ve hazırda bekleme olmadan) olmadan yıllardır onları kullanıyorum. Ama Alain yazar olarak, Guava şekilde daha güzel

İşte örnek bir Bean:

public class Bean{

    private String name;
    private int length;
    private List<Bean> children;

}

İşte equals() ve hashCode() Commons/Lang ile uygulanan:

@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;
    }
}

ve Guava ile burada:

@Override
public int hashCode(){
    return Objects.hashCode(name, length, children);
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return Objects.equal(name, other.name)
            && length == other.length // special handling for primitives
            && Objects.equal(children, other.children);
    } else{
        return false;
    }
}

Gördüğünüz gibi Guava versiyonu daha kısa ve gereksiz yardımcı nesneleri önler. Durumunda eşittir, hatta izin için kısa-devre değerlendirmesi ise bir önceki Object.equal() çağrı false değerini döndürür (doğrusu: commons / lang vardır ObjectUtils.equals(obj1, obj2) yöntemi ile özdeş olan semantik kullanılabilecek yerine EqualsBuilder izin kısa devre yukarıdaki gibi).

Yani: Evet, commons lang inşaatçılar çok tercih edilen üzerinde el ile yapılmış equals() hashCode() yöntem (ya da o korkunç canavarlar Tutulması olacak oluşturmak için), ama Guava sürümleri bile daha iyi.

Ve Uyku hakkında bir not:

senin tembel koleksiyonları ile eşittir konusunda dikkatli olun(), hashCode() ve toString() uygulamaları. Eğer bir açık Oturum yok diye sefil başarısız olur.


(Equals ()) not:

a) eşittir her iki sürümde de (yukarıda), ya da bu kısayollar her ikisini de kullanmak isteyebilirsiniz:

@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) yorumlanmasına bağlı olarak eşittir() kontratı, ayrıca(s) değiştirebilirsin

    if(obj instanceof Bean){

için

    // make sure you run a null check before this
    if(obj.getClass() == getClass()){ 

Eğer ikinci sürümünü kullanıyorsanız, muhtemelen de equals() yöntemin super(equals()) aramak istiyorum. Burada farklı görüşler, konu bu, söz konusu tartışıldı

right way to incorporate superclass into a Guava Objects.hashcode() implementation?

(hashCode(), 25* *için de geçerlidir) hakkında olmasına rağmen


Not (kayahr Yorum esinlenerek)

Objects.hashCode(..) (temel Arrays.hashCode(...)) eğer çok ilkel alanlar varsa kötü gerçekleştirmek. Böyle durumlarda, EqualsBuilder aslında daha iyi bir çözüm olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MrDevin521

    MrDevin521

    18 Temmuz 2010
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006