为什么没有Objects.equal
作为参数接收每种原始类型?
我知道您可以通过#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
的最佳方式吗?原始值将自动生成,并且(即使它有点)性能降低。我可以为它们使用==
,但对我来说它会打破阅读equals方法的“流程”,让它变得有点难看。所以我想知道为什么番石榴lib没有为每个基本类型Objects.equal
。有人知道答案吗?
修改
每个基元(但字节)都有MoreObjects.toStringHelper重载,这就是我想知道没有Objects#equal
的原因之一。此外,使用JB Nizet参数,可以使equals
方法更安全,因为您可以更改int
Integer
,而无需担心同等正确性。
答案 0 :(得分:6)
我可以为他们使用
==
,但对我来说,它会打破阅读equals方法的“流程”,让它变得有点难看。
这并不足以说明为每种原始类型向Guava API添加该方法的重载 - 必须记录,测试和维护API公开的每个方法。当唯一的优点是美学时,没有任何意义。
答案 1 :(得分:2)
我知道你可以通过#valueOf包装这个值,或者让每个原语自动装箱,但是你不会失去性能吗?
是的,但对于对性能敏感的代码,您肯定希望使用==
来获取简单的if_icmpeq
操作码而不是调用方法。因此,如果您正在使用Objects.equal
,那么您可能不会编写对性能敏感的代码,并且可能不会注意到自动装箱的成本。
我并不是说Objects.equal
的原始版本没有任何好处,但是可能不值得向库中添加几种方法。