不一致的 compareTo¶
ID: java/inconsistent-compareto-and-equals
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- correctness
Query suites:
- java-security-and-quality.qls
重写 compareTo
但没有重写 equals
的类可能不会实现与 equals
一致的自然排序。
建议¶
尽管 compareTo
合约并不严格要求这种一致性,但通常应重写这两种方法以确保它们一致,即,对于任何非空 x
和 y
,当且仅当 x.equals(y)
为 true
时,x.compareTo(y)==0
为 true
。
示例¶
在以下示例中,类 InconsistentCompareTo
重写了 compareTo
但没有重写 equals
。
public class InconsistentCompareTo implements Comparable<InconsistentCompareTo> {
private int i = 0;
public InconsistentCompareTo(int i) {
this.i = i;
}
public int compareTo(InconsistentCompareTo rhs) {
return i - rhs.i;
}
}
在以下示例中,类 InconsistentCompareToFix
重写了 compareTo
和 equals
。
public class InconsistentCompareToFix implements Comparable<InconsistentCompareToFix> {
private int i = 0;
public InconsistentCompareToFix(int i) {
this.i = i;
}
public int compareTo(InconsistentCompareToFix rhs) {
return i - rhs.i;
}
public boolean equals(InconsistentCompareToFix rhs) {
return i == rhs.i;
}
}
如果您需要与 equals
不一致的自然排序,则应明确记录它。
参考¶
J. Bloch,Effective Java(第二版),第 12 项。Addison-Wesley,2008 年。
Java API 规范:Comparable.compareTo,Object.equals。