如何重写Java中的equals方法

Python017

如何重写Java中的equals方法,第1张

public class Test {

private Long id

public Long getId() {

return id

}

public void setId(Long id) {

this.id = id

}

public boolean equals(Test t){

return this.getId().compareTo(t.getId()) == 0

}

public static void main(String[] args) {

Test t1 = new Test()

Test t2 = new Test()

t1.setId(1L)

t2.setId(1L)

System.out.println(t1.equals(t2))

}

}

其实重写equals 就是为了让某个类符合自己的equal标准。 比如上面的例子, 重写了Test的equals方法(equals方法是Object的,所以所有的类都有equals方法。)我们的标准是 一旦两个test 的id相同 那么我们就认为他们equal。 如果把重写的equals方法注释掉, 再运行 会打印false, 因为会调用super的equals方法, super的方法体是 obj1 == obj2 跟id没有关系。

使用equals方法比较一个类的两个对象,希望能在逻辑上比较这两个对象是否相等,而不是比较这两个对象的引用是否相同,一般这个时候就需要重写equals方法了。

重写equals方法的注意事项写在了方法说明中,可以点击 这里 查看。

翻译过来的要点如下

是不是看着有点晕,没错,重写equasl方法看起来很简单,但是有很多种方式会导致重写出错。所以最好的做法是,没有必要不要重写equals方法。

如果一定要重写呢,有没有比较省力不容易出错的方法?答案是有的,那就是使用google 的AutoValue开源框架或者IDE自动生成功能。如果使用AutoValue框架,只需要在类上添加一个注解,框架就会自动帮你生成equals方法。

如果一定要自己重写,在重写之后要问自己三个问题:它是对称的吗?它是传递吗?它是一致的吗?(另外两个属性,自反性和非空性一般都都满足),然后还需要编写单元测试加以验证。下面是一个重写equals方法的例子:

另外,重写了equals方法,一定要重写hashCode方法。重写hashCode方法的注意事项,请看 这里 。

参考文章:

Effective Java 第三版——10. 重写equals方法时遵守通用约定