上一篇读后感没有记录实质性的东西,从这篇开始,会记录一些我觉得很重要或者很经典的东西。

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 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注