第八条:覆盖equals时请遵守通用的约定
类的每个实例本质上都是唯一的。
不关心类是否提供给了逻辑相等的测试功能。
超类已经覆盖了equals,从超类继承过来的行为对于子类来说也是合适的。
类是私有的或者是包级私有的,可以确定它的equals方法永运不会被调用。
高质量使用equals的方法:
使用==操作符检查参数是否为这个对象的引用
使用instanceof操作符检查参数是否为正确的类型
把参数转为正确的类型
对于该类中的关键的域,检查参数中的域是否与该对象中对应的域相匹配
覆盖equals总要覆盖hashCode
不要让equals过于智能
不要将equals声明中的Object对象转为其他类型
第九条:覆盖equals时总要覆盖hashCode
第十条:始终要覆盖toString
第十一条:谨慎覆盖clone
Object的clone方法是受保护的,如果不借助反射,就不能仅仅因为一个对象实现了Cloneable,就可以调用clone方法。Cloneable是一个接口,如果一个类实现了Cloneable,Object的clone方法就返回该对象的逐域拷贝。、
创建和返回该对象的一个拷贝:
x.clone()!=x;
x.clone.getClass() == x.getClass()
x.clone.equals(x)
这些判断就是true。
所有实现Cloneable接口的类都应该用一个公有的方法覆盖clone。此共有方法首先调用super.clone,然后修正任何需要修正的域。
第十二条:考虑实现Comparable接口
BigDecimal中compareTo方法可以比较去除小数点的equals,比如2.0和2.00
第十三条:使类和成员的可访问性最小化
如果这个类实现了Serializable接口,这些域就有可能会被泄漏到导出的API中。
长度非0的数组总是可变的,所以类具有供油的静态final数组域,或者返回这种域的访问方法,这几乎总是错误的。除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且要保证公有静态final域所引用的对象都是不可变的。
第十四条:在公有类中使用访问方法,而非公有域。公有类应该暴露非可变的域。
第十五条:使可变性最小化
不可变类只是其实例不能被修改的类。
类成为不可变性:不要提供任何修改对象状态的方法。
保证类不会被扩展。
使所有的域都是final的。
使所有的域都成为私有的。
确保对于任何可变组件的互斥访问。
不可变对象本质上是线程安全的,他们不要求同步。不可变对象可以被自有的共享。
不可变的真正唯一缺点是对于每个不同的值都需要一个单独的对象。
第十六条:符合优先于继承
继承打破了封装性。