当重载equals方法时,遵循惯例.
equals不是每个类都必须重载,当以下几个条件满足,可以不重载equals.
1. 类的实例只有同一个才被判为相等. 如Thread类.
2. 不用关心两个对象是否逻辑相等的时候,或是说比较对象没有意义.
3.父类已经重载了equals,而且父类的equals也适用于子类,子类就不用重载equals.
4.这是一个私有类或是包内访问,你确定equals不会被调用.
那什么时候使用equals呢,当两个对象之间有逻辑相等的意义的时候,而其父类并没有重载适合的equals的时候, 换句话说,也就是数据类. 这种类有比较值的需求, 而不是简单的判断是不是同一个对象.
然而,对实例化进行控制的数据类型对象,如singleton,不用重载equals.
重载要注意以下几个原则:
反射,对称,传递,一致
另外,对于null,一定要返回false.
高效的equals可以参考以下几点.
1. 用==判断是不是同一个实例.
2. 使用instanceof判断是不是同一个类型.
3.强制转化成正确的类型.
4.对每个有比较意义的成员变量都作检查.
5.当你写完之后,要问自己,这个函数是不是对称的,可传递的,一致的.
写完equals后,要注意:
1. 在重载equals后,必须要重载hashCode.
2. 不能简单的比较一个field是不是相等. 如对File这对类,如果两个对象打开的是相同内容的文件,此时不应该判断为相同.
3.不要用另一个类型来代替参数中的Object,否则这就不是重载.
错误例子:
public boolean equals(MyClass o) {
...
}
在编译前使用@Override 可以使编译器在不正确的函数签名时报错.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mutsinghua/archive/2010/01/23/5248724.aspx