您好我从封面(静态工具)获得建议,仅在hashCode中使用非最终字段。为什么我们不能使用非final字段来生成hashCode。错误ID是:MUTABLE_HASH_CODE
答案 0 :(得分:6)
这个想法是,如果两个对象相等,它们必须具有相同的哈希码。所以进入下一步,你可以说一个对象应该总是具有相同的哈希码。显然,如果在哈希码计算中使用非最终字段,那么哈希码将不会保持不变。
对于一个更具体的示例,如果您将一个对象放在一个hashmap中,然后更改该对象,以便hashcode现在在hashmap的错误存储桶中更改该对象。 BAD!
答案 1 :(得分:6)
hashCode通常用于哈希集合,例如HashSet或HashMap。如果任何字段更改会改变hashCode,则会使集合处于无效状态。
因此,hashCode和equals中使用的字段(如果有的话,还是compareTo)最好只使用final字段。另一种选择是仅使用不改变的字段,但这更难检查和执行。