2013-07-30 23 views
1

ToStringBuilder提供了實現的toString方法的便捷方式,就這樣慢怎麼ToStringBuilder,HashCodeBuilder,EqualsBuilder使用反射

@Override 
    public String toString() { 
     return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); 
    } 

而且幾乎同樣的事情來實現hashCode和equals方法。

但在文檔和一些stackoverflow的答案中,它說它有點慢。

我很少使用的方法等於或在我的生產代碼的hashCode,我只在調試過程中使用toString而不是在生產,所以我的問題是: 如果我實現使用EqualsBuilderHashCodeBuilder我的bean的方法, ToStringBuilder反射和我很少使用toString,hashCodeequals它仍然是性能損失?

+4

只有一個辦法,找出:剖析......(但我可以告訴你答案馬上:你不會注意到任何區別) – jlordo

+0

如果你很少調用該方法,它不能性能損失......請注意,你不直接調用它並不意味着它不被調用。 – assylias

回答

4

這取決於如何使用它。例如,如果您使用HashCodeBuilder這樣

public int hashCode() { 
    HashCodeBuilder.reflectionHashCode(this); 
} 

很明顯,即使沒有測量,由於它是基於反射這將是昂貴的。但是,這種方式也不是那麼昂貴

public int hashCode() { 
    HashCodeBuilder hb = new HashCodeBuilder(); 
    hb.append(field1); 
    hb.append(field2); 
    ... 
    return hb.toHashCode(); 
} 

唯一的問題是,它會創建一個可以可以避免的,如果手工做同樣的一個額外的對象。

+0

可接受的答案 –

0

當談到性能影響時,衡量自己總是更好。沒有人能告訴你它將如何影響你的系統。你確定你很少使用equals和hashCode嗎?它們也用於例如Map和Set,這些都是非常常見的結構。

0

我建議你使用「Caliper」來做microbenchmark測試。但是,除了ToStringBuilder之外,我不會使用EqualsBuilderHashCodeBuilder,而是使用IDE生成的那個。

Equals和HashCode傾向於在整個應用程序中定期使用,IDE會生成足夠好的實現。

另一方面,我使用ToStringBuilder,因爲我通常使用toString進行調試。

0

如果您的類是不可變的,或者用於hashCode和toString的字段不會更改,則可以緩存hashCode和toString的結果。所以慢速反射代碼只被調用一次。這爲您提供了爲hashCode和toString編寫自定義代碼所帶來的大部分速度增益,但通常更容易編碼。

這個技巧用於String.hashCode()

int hashCode = 0; 
String toString = null; 

public int hashCode() { 
    int h = hashCode; // local copy for thread safety, see String 
    if (h == 0) { 
    h = HashCodeBuilder.workYourMagic(); 
    hashCode = h; 
    } 
    return h; 
} 

public String toString() { 
    String s = toString; 
    if (s == null) { 
    s = ToStringBuilder.workYourMagic(); 
    toString = s; 
    } 
    return s; 
} 
+0

我不明白這與OP的問題有何關係。他在問是否值得做一次優化,而不是他能做的其他優化。 – MikeFHay

+0

這是(通常)更容易完成全面優化,但提供了大部分速度增益。我只是在回答你的問題時添加了評論。 – user949300

+0

我並不認爲這比編寫'返回HashCodeBuilder.append(a).append(b).build();'更容易,也不會提供相同的速度優勢。我想這一切都取決於你的用例;對於一個足夠複雜的課程,我可以看到你的觀點。 – MikeFHay