上一篇读后感没有记录实质性的东西,从这篇开始,会记录一些我觉得很重要或者很经典的东西。
equals的约定
- 自反性:x.equals(x)必须返回true
- 对称性:y.equals(x)返回true,x.equals(y)也必须返回true
- 传递性:x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也必须返回true
- 一致性:只要对象没有修改,调用equals方法会返回一致的结果
- 对于任何非null值x,x.equals(null)必须返回false
覆盖equals必须覆盖hashCode,所以:
- 对象没有被修改,hashCode必须始终返回同一个整数
- 如果两个对象调用equals相等,那么他们的hashCode必须返回同一个整数
一个推荐的hash算式
hash = 31 * hash + (需要参与hash的field计算的int值)
有多少field计算多少次,hash初始值设为任意非零整数。
Clone
覆盖注意事项:
- 一定要返回super.clone()
- 如果有引用,则要clone引用
- 不要递归clone引用,会引起栈溢出
- 不要忘记检查并抛出CloneNotSupportedException
- 线程安全的类记得将clone方法也实现为同步的
- 尽量不适用Cloneable,而用其他方式来代替它
复合优先于继承
因为继承太过于依赖父类,父类的更改会对子类造成较大的损害。只有当B is A的时候,才能让B继承A。
0 条评论