标签:ted equal not 引用 tcl on() 其他 朋友 over
以常见的自定义Date类型为例,没有经验的朋友可能会觉得直接比较年月日即可,从而写出以下的实现
public class MyDate implements Comparable<MyDate> {
    private final int year;
    private final int month;
    private final int day;
    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    @Override
    public int compareTo(MyDate o) {
        throw new NotImplementedException();
    }
    public boolean equals(Date that) {
        if (this.day != that.day) {
            return false;
        }
        if (this.month != that.month) {
            return false;
        }
        if (this.year != that.year) {
            return false;
        }
        return true;
    }
}
但是想要健壮地实现equals()方法,上述代码是不够的,参考以下代码
//定义为final类型:允许子类直接使用父类equals()方法是不安全的
public final class MyDate implements Comparable<MyDate> {
    private final int year;
    private final int month;
    private final int day;
    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    @Override
    public int compareTo(MyDate o) {
        throw new NotImplementedException();
    }
    @Override
    //规定参数必须是Object类型
    public boolean equals(Object obj) {
        //检查是否相同引用
        if (obj == this) {
            return true;
        }
        //检查null
        if (obj == null) {
            return false;
        }
        //getClass()判断的是准确的运行时类型,instanceof的类型可以是父类或接口
        if (obj.getClass() != this.getClass()) {
            return false;
        }
        //这里类型转换一定是安全的
        MyDate that = (MyDate) obj;
        //确认关键字段都相等
        if (this.day != that.day) {
            return false;
        }
        if (this.month != that.month) {
            return false;
        }
        if (this.year != that.year) {
            return false;
        }
        return true;
    }
}
==Arrays.equals(a,b)或者Arrays.deepEquals(a,b),但不是a.equals(b)compareTo()方法,可以直接拿来使用。例如x.compareTo(y) == 0标签:ted equal not 引用 tcl on() 其他 朋友 over
原文地址:https://www.cnblogs.com/filozofio/p/12286045.html