提供equals()的替代方案?

dsm*_*ith 2 java

假设我有一个叫做的类Number,我打算对Number对象进行大量的相等比较.我担心泛型Number::equals(Object o)方法的"开销"(类比较等).在这种情况下,提供诸如Number::isEqualTo(Number other)替代方法之类的方法是否有用Number::equals(Object o)?这是一种常见的模式吗?或者JVM目前是否已经足够好地优化,这样做没有优势?

这是一个代码示例:

public class Number {
    int _value;

    Number(int value) {
        _value = value;
    }

    @Override
    public boolean equals(final Object o) {
        if (o == this) return true;
        if (o == null) return false;
        if (o.getClass() != getClass()) return false;
        return isEqualTo((Number)o);
    }

    public boolean isEqualTo(final Number other) {
        return _value == other._value;
    }

    public static void main(String[] args) {
        Number one = new Number(1);
        Number two = new Number(2);
        if (!one.isEqualTo(two)) {
            System.out.println("fast comparison?");
        }
        if (!one.equals(two)) {
            System.out.println("slow comparison?");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

这两种方法有不同的语义:

  • equals具有Object::equals合同规定的语义,而
  • isEqualTo具有专门适用于Number对象的语义

由于比较不是苹果对苹果,因此equals需要更多CPU周期才是公平的.但是,您不太可能注意到这种差异.

像你这样的类实现更为常见Comparable<T>.语义在那里需要进行排序检查,而不仅仅是对于等式检查,但是不需要使用未知类的对象,从而节省CPU周期.

您应该有充分的理由提供相等的替代方法(例如,分析器运行指向equals(Object)瓶颈,由于更改导致可读性的改进,或者由于采用更多的接口而实现更丰富的语义).为了减少几个CPU周期而这样做会过早优化.