Effective Java 学习笔记(8)

来源:互联网 发布:淘宝网的绿知了的价格 编辑:程序博客网 时间:2024/05/01 00:45

当重载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