我希望一个特定类的对象如果其中一个字段相等则被视为相等。如何为这样的类编写一致的hashCode方法?
(免责声明,因为我知道这不是最佳实践:该类是另一个类的包装器,并应用于Map中的键。两个具有一个相等字段的不同对象将导致相同的Map条目。实际上,每个字段都可以单独标识基础对象,但我并不总是有相同的标识字段可用于两个对象。我不能控制并因此无法更改这种“模糊”的标识机制。也欢迎其他解决方案。)
是否有实现相应hashCode()的策略?我只知道涉及连接(如&&)的实现方式。如何确保如果任一字段相等,则hashCode()相同?
下面是我想编写一致的hashCode()实现的简化equals方法:
(免责声明,因为我知道这不是最佳实践:该类是另一个类的包装器,并应用于Map中的键。两个具有一个相等字段的不同对象将导致相同的Map条目。实际上,每个字段都可以单独标识基础对象,但我并不总是有相同的标识字段可用于两个对象。我不能控制并因此无法更改这种“模糊”的标识机制。也欢迎其他解决方案。)
是否有实现相应hashCode()的策略?我只知道涉及连接(如&&)的实现方式。如何确保如果任一字段相等,则hashCode()相同?
下面是我想编写一致的hashCode()实现的简化equals方法:
public boolean equals(C other)
{
return (field1 != null && field1.equals(other.field1))
|| (field2 != null && field2.equals(other.field2))
|| (field3 != null && field3.equals(other.field3));
}
编辑:根据输入数据,不可能出现类似于(1, 2, 3)等于(1, 6, 7)的情况。对象只会产生一些字段为空的情况,但不会像例子中那样矛盾。简单来说,在实践中,唯一等于(1, 2, 3)的组合应该是(1, 2, 3),(1, null, null),(null, 2, null),(1, 2, null)等等。我承认这种方法并不特别强大。
equals
方法呢?难道你不能定义一个实现这个逻辑的函数对象,并且只在实际需要的地方显式地使用它吗?这样做会使你的代码更清晰,避免未来出现许多令人困惑的错误。 - 5gon12eder