覆盖 equals
时请遵守通用约定:
- 自反性(reflexive)。对于任何非
null
的引用值x
,x.equals(x)
必须返回true
。 - 对称性(symmetric)。对于任何非
null
的引用值x
和y
,当且仅当y.equals(x)
返回true
时,x.equals(y)
必须返回true
。 - 传递性(transitive)。对于任何非
null
的引用值x
、y
和z
。如果x.equals(y)
返回true
,并且y.equals(z)
也返回true
,那么x.equals(z)
也必须返回true
。 - 一致性(consistent)。对于任何非
null
的引用值x
和y
,只要equals
的比较操作在对象中所用的信息没有被修改,多次调用x.equals(x)
就会一致地返回true
,或者一致的返回false
。 - 对于任何非
null
的引用值x
,x.equals(null)
必须返回false
。
覆盖 equals
时总要覆盖 hashCode
在每个覆盖了 equals 方法的类中,也必须覆盖 hashCode 方法 。如果不这样做的话,就会违反 Object.hashcode
的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,这样的集合包括 HashMap
、HashSet
和 Hashtable
。
覆lombak:@Data注解:
- 此注解会生成
equals(Object other)
和hashCode()
方法,是遵循约定的。 - 它默认使用非静态,非瞬态的属性
- 可通过参数
exclude
排除一些属性 - 可通过参数
of
指定仅使用哪些属性 - 它默认仅使用该类中定义的属性且不调用父类的方法
- 可通过
callSuper=true
解决上一点问题。让其生成的方法中调用父类的方法