5

为什么每个原始类型都没有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 方法的“流程”,使它有点难看。所以我想知道为什么 guava lib 没有Objects.equal每个原始类型。有人知道答案吗?

编辑

每个原语(但字节)都有MoreObjects.toStringHelper重载,这就是我想知道没有 for 的原因之一Objects#equal。此外,使用JB Nizet参数,它会使equals方法更安全,因为您可以更改intforInteger而不必担心相等的正确性。

番石榴文档

4

2 回答 2

6

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

这不是为每个原始类型添​​加该方法的重载到 Guava API 的一个足够令人信服的理由——API 公开的每个方法都必须记录、测试和维护。当唯一的优势是美学时,这没有任何意义。

于 2013-04-16T21:46:06.053 回答
2

我知道您可以通过#valueOf 将值装箱或让每个原语自动装箱,但这样做不会失去性能吗?

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

我并不是说原始版本的Objects.equal收益为零,但可能不值得向库中添加几种方法。

于 2013-04-17T02:36:23.713 回答