我需要摆脱pmd违规行为,并说明' equals()'没有相应的定义' hashCode()'

时间:2015-03-06 12:21:33

标签: java pmd

我有一个程序,其中equals()方法已被覆盖,但hashcode()不是,但根据这两者之间的java契约,哈希码也必须被覆盖。在这种情况下,我只想覆盖hashcode()而不会导致程序流程的任何变化。我没有使用生成的哈希码插入任何hashmap或哈希表。所以告诉我覆盖hashcode()的最佳解决方案。

1 个答案:

答案 0 :(得分:0)

@fge指出,最好的解决方案是正确实施hashcode(),即使您不希望使用它。

但如果您决定忽略此问题而未正确实施hashcode(),那么我建议您按照以下方式实施:

public int  int hashcode() {
    // Fail fast!
    throw new UnsupportedOperationException("hashcode");
}

如果您(或维护代码的其他人)忘记了,并且将此类的实例放入哈希表中,那么您提出的两个“解决方案”就会出现问题。

这个问题:

public int  int hashcode() {
    return 0;
}

它会给你带来悲观的表现。

您的其他提案:

public int  int hashcode() {
    return this.hashcode();
}

要么失败(带有StackOverflowError异常),要么在使用时进入无限循环。实际行为(至少在理论上)是特定于平台的。