2013-04-16 119 views
5

爲什麼沒有Objects.equal接收每個原始類型的參數?爲什麼沒有guava Objects.equal(Object,Object)爲原始類型?

我知道你可以通過#valueOf裝箱價值或讓每個原語自動複製,但是你不會失去這樣的表現嗎?這是我一直想知道的事情。

想象我有類似

public class Foo { 
    private final int integerValue; 
    private final boolean booleanValue; 
    private final Bar bar; 

    public Foo(int integerValue, boolean booleanValue, Bar bar) { 
     this.integerValue = integerValue; 
     this.booleanValue = booleanValue; 
     this.bar = bar; 
    } 

    @SuppressWarnings("boxing") 
    @Override 
    public boolean equals(Object object) { 
     if (object instanceof Foo) { 
      Foo that = (Foo) object; 

      return Objects.equal(this.integerValue, that.integerValue) 
        && Objects.equal(this.booleanValue, that.booleanValue) 
        && Objects.equal(this.bar, that.bar); 
     } 
     return false; 
    } 

    // hashCode implementation using guava also. 
} 

這是實現equals的最佳方式?原始值將被自動複製,受到損害(即使有點)性能下降。我可以爲他們使用==,但對我來說,它會打破閱讀等值方法的「流程」,使其變得有點難看。所以我想知道爲什麼番石榴lib沒有每種基本類型的Objects.equal。有人知道答案嗎?

編輯

還有爲MoreObjects.toStringHelper超載每個原始的(但字節),這是一個我不知道的原因大概沒有爲Objects#equal。此外,使用JB Nizet參數,它會改變方法的安全性,因爲您可以更改intInteger,而不必擔心同等的正確性。

Guava docs

+0

關於你的編輯 - ToStringHelper似乎是Objects的成員,因爲所有的Object都有'toString()'的共同點。輔助函數本身接受'int'參數等等的事實只是因爲一個'Object'可能包含一個'int'(被包含在'toString()'結果中)。希望這是有道理的。 –

+0

但如果這是因爲你可能有一個'int'字段,那麼'Objects#equal'也是如此。雖然不同於'Object#equal',可以用'=='替代,但'StringHelper#add'中沒有什麼可以用來避免自動裝箱。因此,原始方法。或者至少這就是我的想法:P –

回答

6

我可以只使用==他們,但對我來說這將打破讀取equals方法,把它一點點醜「流」。

這並不足以令人信服地將每種原始類型的重載方法添加到Guava API-- API公開的每種方法都必須進行記錄,測試和維護。當唯一的優點是美學時,它是沒有意義的。

+2

+1,但我認爲這不是一個「令人信服的*足夠*的原因。「 –

+0

我明白了這一點,但我們經常做些讓代碼變得更具可讀性的東西,並不是這種情況,但我不知道要維護這種重載方法有多難(不是批評者,我真的除了測試和文檔之外,還不知道) –

+5

對於每個經過那裏試圖找到某些東西的用戶來說,這些成本在Object類的Javadoc中還包含額外的混亂因素,這是爲了獲得相當有限的(並且有爭議的)好處。另外,我不得不承認,我覺得在一個名爲'Objects'的類中對原始類型進行特殊的'equals'處理是非常奇怪的。 –

2

我知道你可以通過#valueOf裝箱價值,或者讓每個原語自動複製,但是你不會失去這樣的表現嗎?

沒錯,但對於性能敏感的代碼,你肯定會想使用==反正得到一個簡單的if_icmpeq操作碼,而不是調用一個方法。因此,如果您完全使用Objects.equal,則可能不會編寫性能敏感的代碼,並且可能不會注意自動裝箱的成本。

我並不是說Objects.equal的原始版本沒有任何好處,但它可能不值得向庫中添加幾種方法。

+0

好吧。謝謝你的回答:D –

相關問題