ToStringBuilder
提供了一种实现toString
方法的便捷方式,就像这个
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
实现hashCode
和equals方法几乎相同。
但是在文档和stackoverflow的一些答案中,它表示它有点慢。
我很少在生产代码中使用equals或hashCode方法,我只在调试过程中使用toString
但在生产中没有,所以我的问题是:
如果我使用 EqualsBuilder , HashCodeBuilder , ToStringBuilder 使用反射实现我的bean方法,我很少使用toString
,hashCode
或者equals
是否仍然是性能损失?
答案 0 :(得分:4)
这取决于如何使用它。例如,如果你像这样使用HashCodeBuilder
public int hashCode() {
HashCodeBuilder.reflectionHashCode(this);
}
即使没有测量它也很昂贵,因为它基于反射。但这种方式并不那么昂贵
public int hashCode() {
HashCodeBuilder hb = new HashCodeBuilder();
hb.append(field1);
hb.append(field2);
...
return hb.toHashCode();
}
唯一的问题是它会创建一个额外的对象,如果手动执行相同的操作则可以避免。
答案 1 :(得分:0)
在性能影响方面,衡量自己总是更好。没有人能告诉你它将如何影响你的系统。你确定你很少使用equals和hashCode吗?它们也用于例如Map和Set,这是非常常见的结构。
答案 2 :(得分:0)
我建议您使用“Caliper”进行微基准测试。但是,除了ToStringBuilder之外,我不会使用EqualsBuilder
和HashCodeBuilder
而是使用IDE生成的那个。
Equals和HashCode的原因往往是在整个应用程序中定期使用,IDE会产生足够好的实现。
另一方面,我使用ToStringBuilder
,因为我通常使用toString进行调试。
答案 3 :(得分: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;
}