Java FindBugs-如何解决EQ_比较使用对象等于
我在这里不知所措Java FindBugs-如何解决EQ_比较使用对象等于,java,findbugs,compareto,Java,Findbugs,Compareto,我在这里不知所措 1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> { 2: String tableName; 3: String fkFieldName; 4: 5: public int compareTo(ForeignKeyConstraint o) { 6: if (this.tableName.compareTo(o.tab
1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> {
2: String tableName;
3: String fkFieldName;
4:
5: public int compareTo(ForeignKeyConstraint o) {
6: if (this.tableName.compareTo(o.tableName) == 0) {
7: return this.fkFieldName.compareTo(o.fkFieldName);
8: }
9: return this.tableName.compareTo(o.tableName);
10: }
11: }
1:私有静态类ForeignKeyConstraint实现可比较{
2:字符串表名;
3:字符串字段名;
4:
5:公共内部比较(ForeignKeyo){
6:if(this.tableName.compareTo(o.tableName)==0){
7:返回此.fkFieldName.compareTo(o.fkFieldName);
8: }
9:返回this.tableName.compareTo(o.tableName);
10: }
11: }
在第6行中,我从FindBugs获得:Bug:net.blabla.SqlFixer$ForeignKeyConstraint定义compareTo(SqlFixer$ForeignKeyConstraint)并使用Object.equals()
我不知道如何更正此错误。此错误意味着您没有覆盖
ForeignKeyConstraint
中的equals
(从而从对象继承equals
),因此以下内容不正确(来自的javadoc):
强烈建议但不严格要求(x.compareTo(y)=0)=(x.equals(y))
。一般来说,任何实现可比较接口并违反此条件的类都应该清楚地指出这一事实。建议使用的语言是“注意:此类具有与equals不一致的自然顺序。”
要修复FindBugs检查,请重写equals
-和hashCode
-如果这是有意义的,通常是这样的(或者使用建议的注释排除对此类的检查并记录您的类违反了此条件)。您是否也尝试过在SqlFixer.ForeignKeyConstraint中重写equals方法
我相信这个警告的基础是,正如定义中所说的,如果你忽略compareTo而不是equals,奇怪的事情就会发生
有关更多信息,请查看。第12项更深入地介绍了实施Comparable的细节和一些需要注意的事项 您可以通过实现equals()方法来解决它。请参阅FindBugs定义:
通常,当且仅当equals返回true时,compareTo的值应返回零。如果违反此规定,则PriorityQueue等类中会出现奇怪且不可预测的失败
强烈建议(x.compareTo(y)==0)=(x.equals(y)),但不是严格要求
另一个例子是树集。它通过调用compareTo来实现相等性检查,如果compareTo实现与equals不一致,则会使树集违反Set接口的约定,这可能会导致程序故障。它告诉您compareTo()和equals()可能不一致。事实上,他们永远不应该不同意
equals()方法继承自java.lang.Object,默认情况下,它会检查两个对象是否是同一实例。您的compareTo方法正在比较基于tableName和fkFieldName的对象。因此,您可能会发现compareTo声明两个对象是相同的(因为tableName和fkFieldName匹配),但等于它们不同的状态(因为它们是不同的实例)
有一些java API依赖于compareTo和equals的一致性;这是java语言的一部分,被视为核心语言契约。理想情况下,实现一个equals(和hashcode)方法来检查基于tableName和fkFieldName的相等性。Findbugs很满意:
public int compareTo(ForeignKeyConstraint o) {
if (this.equals(o)) {
return 0;
} else if (this.tableName.equals(o.tableName)) {
// fkFieldName must be different
return this.fkFieldName.compareTo(o.fkFieldName);
} else {
// tableName must be different
return this.tableName.compareTo(o.tableName);
}
}
@Override
public equals() {
...
}
@Override
public int hashCode() {
...
}