2010-04-09 10 views
9

Ich bin ahnungslos hier ...FindBugs - wie EQ_COMPARETO_USE_OBJECT_EQUALS

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: } 

In Zeile 6 I von FindBugs erhalten lösen: Bug: net.blabla.SqlFixer$ForeignKeyConstraint defines compareTo(SqlFixer$ForeignKeyConstraint) and uses Object.equals()

Link to definition

Ich weiß nicht, wie dies zu korrigieren .

Antwort

13

Dieser Fehler bedeutet, dass Sie überschreiben equals nicht in ForeignKeyConstraint (und damit die equals von Object vererben), so dass die folgenden nicht wahr ist (von der javadoc von compareTo):

Es wird dringend empfohlen, aber nicht unbedingt erforderlich, dass (x.compareTo(y)==0) == (x.equals(y)). Im Allgemeinen sollte jede Klasse, die die Vergleichsschnittstelle implementiert und diese Bedingung verletzt, diese Tatsache deutlich angeben. Die empfohlene Sprache ist "Anmerkung: Diese Klasse hat eine natürliche Reihenfolge, die mit Gleichen nicht übereinstimmt."

die FindBugs Prüfung zu beheben, außer Kraft setzen equals - und hashCode - wenn es sinnvoll, die in der Regel der Fall ist, macht (oder die Prüfung für diese Klasse und Dokument ausschließen, dass Ihre Klasse dieser Bedingung mit der vorgeschlagenen Note verletzt).

2

Haben Sie versucht, die equals-Methode auch in SqlFixer.ForeignKeyConstraint zu überschreiben?

Ich glaube, die Grundlage der Warnung ist, dass, wie in der Definition angegeben, seltsame Dinge passieren können, wenn Sie compareTo und nicht gleich überschreiben.

Weitere Informationen finden Sie unter Joshua Bloch's Effective Java, 2nd Edition. Punkt 12 geht ausführlicher auf die Einzelheiten der Implementierung von Vergleichbar und einige der Dinge ein, auf die man achten sollte.

4

Sie können es lösen, indem Sie eine equals() -Methode implementieren. Siehe die FindBugs-Definition:

"Im Allgemeinen sollte der Wert von compareTo genau dann null zurückgeben, wenn equals true zurückgibt. Wenn dies verletzt wird, werden seltsame und unvorhersehbare Fehler in Klassen wie PriorityQueue auftreten."

"Es wird dringend empfohlen, ist aber nicht unbedingt erforderlich, dass (x.compareTo (y) == 0) == (x.equals (y))."

Ein anderes Beispiel ist das TreeSet. Es implementiert Gleichheitsprüfungen durch Aufrufen von compareTo, und eine compareTo-Implementierung, die mit equals nicht übereinstimmt, bewirkt, dass TreeSet gegen den Vertrag der Set-Schnittstelle verstößt, was zu einer Fehlfunktion des Programms führen kann.

4

Es sagt dir, dass es für compareTo das Potential ist() und equals() zu widersprechen. Und sie sollten wirklich nie widersprechen.

Die equals() -Methode wird von java.lang.Object geerbt, das standardmäßig prüft, ob zwei Objekte gleich instance sind. Ihre compareTo-Methode vergleicht Objekte, die auf tableName und fkFieldName basieren. So werden Sie möglicherweise selbst in einer Situation, wo compareTo besagt, dass zwei Objekte gleich sind (weil Tabellenname und fkFieldName Spiel), aber gleich Staaten sie verschieden sind (weil sie verschiedene Instanzen sind).

Es gibt ein paar Java-APIs, die von compareTo und equals konsistent abhängen; Dies ist Teil der Java-Sprache und gilt als Kernsprache Vertrag. Idealerweise implementieren Sie eine equals (und hashcode) -Methode, um anhand von tableName und fkFieldName auf Gleichheit zu prüfen.

0

Findbugs ist glücklich mit:

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() { 
    ... 
} 
Verwandte Themen