为什么没有guava Objects.equal(Object,Object)到原始类型?

时间:2013-04-16 21:35:55

标签: java performance guava

为什么没有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,而无需担心同等正确性。

Guava docs

2 个答案:

答案 0 :(得分:6)

  

我可以为他们使用==,但对我来说,它会打破阅读equals方法的“流程”,让它变得有点难看。

这并不足以说明为每种原始类型向Guava API添加该方法的重载 - 必须记录,测试和维护API公开的每个方法。当唯一的优点是美学时,没有任何意义。

答案 1 :(得分:2)

  

我知道你可以通过#valueOf包装这个值,或者让每个原语自动装箱,但是你不会失去性能吗?

是的,但对于对性能敏感的代码,您肯定希望使用==来获取简单的if_icmpeq操作码而不是调用方法。因此,如果您正在使用Objects.equal,那么您可能不会编写对性能敏感的代码,并且可能不会注意到自动装箱的成本。

我并不是说Objects.equal的原始版本没有任何好处,但是可能不值得向库中添加几种方法。