CodeQL 文档

不一致的 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

点击以在 CodeQL 存储库中查看查询

重写 compareTo 但没有重写 equals 的类可能不会实现与 equals 一致的自然排序。

建议

尽管 compareTo 合约并不严格要求这种一致性,但通常应重写这两种方法以确保它们一致,即,对于任何非空 xy,当且仅当 x.equals(y)true 时,x.compareTo(y)==0true

示例

在以下示例中,类 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 重写了 compareToequals

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 不一致的自然排序,则应明确记录它。

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私