标签: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