番石榴对象(不建议使用)或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