我使用哈希码构建器作为pojo的实例变量。
public class Pojo {
private HashCodeBuilder hashBuilder = new HashCodeBuilder();
private int i;
public setI(int i) {this.i = i}
@Override
public int hashCode() {
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
}
现在,如果我将i
的值设置为相同的值两次,那么我的哈希码结果将会不同。这是实施中的错误吗?
我知道它正在发生,因为哈希码构建器保持运行总计。但它不应该为同一组值提供相同的哈希值吗?
另外,如果我不遵循上述方法,那么我将最终在我的pojo的hashcode
方法中初始化相同的哈希码构建器数千次,如下所示:
...
@Override
public int hashCode() {
hashBuilder = new HashBuilder();
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
...
有没有办法重置这个运行总计,这样每次我用同一组值调用hashcode
时,我都会得到一致的答案?
答案 0 :(得分:1)
您这样做的方式每次拨打id
时,您都会追加另一个hashCode()
。由于append()
正在接受值(不是字段名称!),HashCodeBuilder
无法知道您是否附加了id
两次,或者您是否有另一个具有相同值的字段
在HashCodeBuilder
中本地创建hashCode()
。不要以为它会以显着的方式影响性能,除非你已经对应用程序进行了分析并证明它确实存在(也就是说避免过早优化)。
如果您确实希望避免在每个HashCodeBuilder
上不必要地创建hashCode()
,则必须跟踪设置器中的更改,并在每次设置时将hashCodeBuilder
设置为null
价值通过二传手变化;然后根据需要在hashCode()
中使用它。然后你必须确保所有的字段修改都通过setter。相当多的工作和许多事情都可能出错,所以如果可能的话,你真的想避免这一切。