java通用对象
所有对象共有的方法(第3章)
这是Joshua Blochs的有效Java第3章的简短摘要。我仅包含与自己相关的项目。
一般
等值合约将等价关系描述为:
-  x.equals(null) == false
-  自反 – x.equals(x) == true
-  对称 –如果x.equals(y) == true则y.equals(x) == true
-  传递性 –如果x.equals(y) == true和y.equals(z) == true则x.equals(z) == true
- 一致 –在相同的未修改对象上多次调用equals,返回相同的值。
有一些值得注意的属性可以改变:
-  如果违反了以上约定,则其他对象(如List.contains())的行为未定义。
-  除非您愿意放弃OO抽象的优点,否则无法在保留等值关系的同时用新的值字段/组件扩展可实例化的类。 - 注意,如果基类是抽象的,就可以了。
 
-  java.net.URL依赖于与URL关联的主机的IP地址,这些主机需要网络访问,因此会破坏一致性。
-  这本书给出了创建最佳等式的方法: -  检查参数==this
-  使用的instance of检查类型是否正确
- 转换为正确的类型
- 比较重要领域
 
-  检查参数
当您覆盖
 哈希码由基于哈希的结构使用。 哈希码协定中最重要的部分规定,相等的对象必须返回相等的哈希码。 此外,哈希码函数应为不相等的对象返回不同的值,以提高性能。 如果没有正确的哈希码实现,则将相等的对象视为不相等的基于哈希的结构将表现不佳,甚至更糟。 如果将常量值作为hashCode提供,例如... return 42 ,则哈希表会退化为链接列表,并且程序应以线性时间运行,并以二次时间运行。 
始终覆盖
…因为它使调试容易得多。
注意
 实现Clonable使Object.clone()返回一个逐字段的副本,否则将抛出CloneNotSupportedException 。 通常,克隆会创建一个对象,但会绕过构造函数。 实现clone存在几个挑战: 
-  通常,尤其是在扩展类时,在覆盖clone,应返回super.clone()返回的对象以获取正确的类型。 这不是强制性的,它由用户决定,但是如果没有它,克隆可能会中断。
-  clone不会复制可变的对象字段,因此super.clone()将引用相同的对象字段。 必须手动克隆字段。- 从本质上讲,这意味着与克隆一起使用时,字段不能为“ final”,除非可以共享相同的字段值。
 
-  由于clone在不使用构造函数的情况下创建对象,因此必须确保创建后所有不变式都是正确的。
-  必须在内部列表/数组上递归调用clone。
 一般建议是避免使用和实现Object.clone() ,而是使用复制构造函数public Yum(Yum yum)或工厂,除非复制数组。 
实施
 可比较处理订单比较,例如在使用TreeSet , TreeMap , search或sort 。 
-  可比对象具有相似的合同,即equals,如果被破坏,可能会导致行为不稳定。 合同要求对称,自反和传递。
-  equals是不符合compareTo可以创建一些集合重复。
-  Float和Double具有它们自己的静态compareTo方法,这些方法应简化处理浮点问题。
-  减去整数以创建compareTo返回值时要小心,因为它可能会导致溢出(即在Integer.MAX_VALUE之外)并创建错误的返回值! 如果i为大正值而j为大负值,则ij将溢出并返回负值。
翻译自: https://www.javacodegeeks.com/2017/05/effective-java-method-common-objects.html
java通用对象