番石榴對象(不建議使用)或MoreObjects實現使用ToStringHelper類助洗劑圖案,所述add()函數是用於兩個基本類型和對象實現:番石榴,Objects/MoreObjects重載以避免自動裝箱。
public ToStringHelper add(String name, @Nullable Object value)
public ToStringHelper add(String name, boolean value)
public ToStringHelper add(String name, char value)
... (other primitive type)
類工作正常,即使沒有基本類型的過載,因爲自動裝箱會轉換並調用add(String,Object)函數。
所以我的問題是爲所有原語使用重載以避免自動裝箱的原因?
1.重複自動裝箱可能是一個巨大的開銷,但對於大多數情況下,這不會發生。有效的Java項目49,更喜歡原始類型對裝箱的基元。
2.Efffective的Java,項目41,P193,
一個安全保守的政策絕不是兩個超載出口相同數量的參數。
ToStringHelper示例明顯違反了此策略。作者繼續在類ObjectOutputStream中討論,不同的基元有它們自己的函數:writeBoolean(boolean),writeInt(int)...我從來沒有能夠理解使用不同名稱的優點來避免這個特定例子的重載,爲什麼它好?
任何意見將受到歡迎。
我認爲在這裏違反#2的原因是沒有「破損」的情況 - 所有的原始類型的情況下做相同的東西,相應的盒裝類型會 - - 它不像它的罰款布爾,但你會得到'char'的異常。對於'String.valueOf'中的所有基本類型都有原始方法重載,它們能夠在不創建盒裝對象的情況下進行轉換,因此避免不必要的對象創建是有意義的(EJ Item 5)。 – 2015-03-19 05:23:31
緊隨「安全保守政策」之上的是不太保守的聲明,「避免**令人困惑**超載的使用」。然後它會說'確切地說,構成混淆使用超載的因素有一些爭議'。我不認爲這是令人困惑的 - ToStringHelper的實現像你期望的那樣工作,對於你傳遞的所有內容。 – 2015-03-19 05:27:38