学习effective java-8对所有对象共同的方法之覆写equals方法时请遵从一般规约

来源:互联网 发布:照片拼贴软件 java 编辑:程序博客网 时间:2024/05/16 06:32
该知识点是自己从书籍中学习的笔记

背景

 Ojbect的equals方法代表的是引用是否引用的同一对象的相等性测试。

在以下情况下,Object的equals方法是不必覆写的:

ü  类的每个实例都是独一无二的。比如说线程,线程代表的是活动实体而不是值。此时Object的equals方法足以是满足该要求的。

ü  当用户并不关心逻辑是上的相等性的时候,可以不覆写equals方法。比如说一般情况下,当两个学生有相同的名字和学号时,我们都会认为是同一个人,但是有的人就认为这是两个不同的学生,那么就必要覆写equals方法。

ü  当父类的equals方法足够满足子类的比较时,就不需要覆写equals方法。比如Set的大部份实现类都继承调用了AbstractSet中的equals方法。

ü  如果类是私有的或者package-private的话,并且确认这些不会用来测试相等性的时候,就必须覆写equals方法,如下:

@Override public boolean equals(Object o) {

throw new AssertionError(); // Method is never called

}

何时覆写equals?

  当两个对象有逻辑上的相等的时候。大部分都是针对类中的属性来进行相等性比较的。

Object的equals方法的特性

  对于Object的equals方法的特性,请查看Java SE的文档,上面说的几条规则很清楚,必须遵守。

覆写equals的注意

1.覆写的equals方法是否满足:对称性、传递性、一致性。

2.覆写了equals方法的同时,一定要覆写hashCode()。

3.这样写public boolean equals(MyObject obj){}是错误的,这代表的是重载,而不是覆写。里面的参数类型不一样。所以必须这样public boolean equals(Object obj){}才正确。

 

原创粉丝点击