4 Stimmen

die Methode equals überschreibt die Methode equals in der Superklasse und ist möglicherweise nicht symmetrisch

Ich habe unten Findbugs Fehler für meine "gleich" Methode,

Diese Klasse definiert die eine "equals"-Methode in einer Oberklasse überschreibt. Beide equals-Methoden Methoden verwenden instanceof in der Bestimmung, ob zwei Objekte gleich sind. Dies ist mit Gefahren verbunden, denn es ist wichtig, dass die equals Methode symmetrisch ist (mit anderen Worten, a.equals(b) == b.equals(a)). Wenn B ein Untertyp von A ist und die Gleichheitsmethode von A prüft, ob das Argument ein Instanz von A ist, und die equals-Methode von B prüft, dass das Argument ein Instanz von B ist, ist es sehr wahrscheinlich, dass die Äquivalenzrelation, die durch Methoden definierte Äquivalenzbeziehung nicht symmetrisch ist.

Ich kann den Code aus Sicherheitsgründen hier nicht veröffentlichen. Bitte lassen Sie mich wissen, was der Fehler ist?

17voto

SJuan76 Punkte 24170

Darin heißt es, dass der Vertrag von equals() impliziert dies, a.equals(b) ist wahr, wenn und nur wenn b.equals(a) wahr ist.

Wenn B A erweitert, in A.equals(Object obj) haben Sie wahrscheinlich

if !(obj instanceof A) return false;

und in B.equals(Object obj) haben Sie

if !(obj instanceof B) return false;

Hier ist die Asymmetrie: Eine Instanz von B macht ( b instanceof A ) wahr, während eine Instanz von A die ( a instanceof B ) falsch. Es bedeutet also ein Risiko als a.equals(b) wahr ist und b.equals(a) falsch ist.

5voto

Ilya Punkte 28356

Sie können eine ähnliche Konstruktion verwenden, um diesen Fehler zu vermeiden:

public boolean equals(final Object obj)
{
   if (obj == null || getClass() != obj.getClass())
   {
      return false;
   } 
// ... 

anstelle von

public boolean equals(final Object obj)
{
   if (!(o instanceof UniversalIDDefinition))
   {
      return false;
   }   
// ...

1voto

Sie können dies auch verwenden:

if (obj == null || !MyClass.class.isAssignableFrom(obj.getClass())) {
    return false;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X