Überprüfen von Objekten auf Identitäts- und Sonarprobleme

8

Wir überprüfen die Qualität unseres Codes mithilfe von Sonar und Sonar fand Code, der Objekte auf Identität wie folgt vergleicht:

%Vor%

Sonar findet diese Art der Identitätsprüfung als besonders kritisch, und schlägt vor, die Identitätsprüfung (unter Verwendung von == ) durch eine Prüfung auf Gleichheit zu ersetzen (stattdessen .equals() verwenden). Identitätskontrollen, so die Begründung dafür, sind oft nicht gemeint.

In unserem Fall durchlaufen wir jedoch eine Liste von Cell s und überprüfen in jeder Iteration ( currentCell ), ob wir eine spezielle Zelle bearbeiten, die wir bereits haben ( cellOfInterest ).

Ich würde gerne hören, ob es andere Muster gibt als unsere, die üblich sind und die dieses Problem einfach durch ein anderes Design vermeiden. Oder welche Lösungen schlagen Sie vor, eine Identitätskontrolle in der genannten Situation zu vermeiden?

Wir haben eine Ersetzung der Identitätsprüfung durch eine Gleichheitsprüfung wie oben beschrieben erwogen, aber sie scheint in unserer Situation nicht anwendbar zu sein, da andere Zellen auch "gleich", aber nicht identisch sein könnten.

Alle Ideen sind willkommen!

    
Alfe 19.06.2015, 15:48
quelle

3 Antworten

7

Wenn Identität das ist, was Sie brauchen, dann ist es das, was Sie brauchen. Die Warnung ist sinnvoll, da es sich häufig um einen Fehler handelt, in diesem Fall jedoch nicht.

Als Beispiel: IdentityHashMap (funktioniert mit identity vs Gleichheit) hat dies in seinem Javadoc:

  

Diese Klasse ist keine universelle Kartenimplementierung! [...] Diese Klasse ist nur für die seltenen Fälle vorgesehen, in denen Semantik für die Referenzgleichheit erforderlich ist.

So ist es selten nützlich, aber hat seine Verwendungen. Sie sind in einer ähnlichen Position. Und natürlich Der interne Code erfüllt genau das, was Sie erwarten. Er verwendet == , um einen Schlüssel zu erhalten.

Fazit: Ich sehe nicht, warum Sie den Code komplexer machen müssten, nur weil ein Tool zur statischen Codeanalyse sagt, dass es ein Problem sein könnte - ein solches Tool soll Ihnen helfen und Sie nicht in einige zwingen seltsames Konstrukt, das im Wesentlichen dasselbe macht. Ich würde erklären, warum == in einem Kommentar für Klarheit verwendet wird, markieren Sie es als falsch positiv und weitermachen.

Wenn Sie die Warnung wirklich entfernen möchten, ist die einzige Option, die ich mir vorstellen kann, die Verwendung von equals und die Änderung der Methode equals entweder:

  • der Standard Object#equals , der auf Identität basiert
  • eine Implementierung, die die Zellen eindeutig identifiziert, vielleicht basierend auf einer eindeutigen ID oder Koordinaten?
assylias 24.06.2015 08:14
quelle
2

Für Strings und die meisten anderen Java-Objekte ist es möglich, zwei Instanzen zu haben, deren Identität ungleich ist, die aber tatsächlich um .equals äquivalent sind. Es ist üblich, == für einen Vergleich zu vermeiden (stattdessen equals oder compareTo), aber wenn es funktioniert, funktioniert es. Sie können das Element in SonarQube als falsch positiv markieren.

    
Barett 19.06.2015 15:51
quelle
1

Zunächst treten keine Probleme auf, wenn Sie Ihre Identitätsprüfung einfach durch einen Gleichheitsaufruf ersetzen (außer dass Sie auf cellOfInterest nach Nullwerten suchen müssen), da die Standardimplementierung von equals in Object die Identitätsprüfung ist.

%Vor%

unterbricht den Code nicht. Es verhält sich genau so wie Ihr Code, wenn ich annehmen kann, dass currentCell nicht null ist.

Um die Null-Überprüfung wegzulassen (und das Verhalten bei beiden Werten auf Null zu halten), können Sie auch (seit Java 7)

verwenden %Vor%

Im Allgemeinen ist die Verwendung von equals die bessere Architektur.

Um beide Fälle anzuzeigen, haben Sie erwähnt:

  • Wenn die Klasse von Ihnen selbst veränderbar ist, könnten Sie (oder auch nicht) zu dem Schluss kommen, dass es bessere Möglichkeiten für Gleichheit als Identität gibt; also ändern Sie einfach die equals (und vergessen Sie nicht den hashCode!) in Ihrer Klasse.

  • Wenn Sie die Klasse nicht ändern können, müssen Sie auf eine sinnvolle Implementierung von equals und hashCode durch den Anbieter der Klasse vertrauen.

Uwe Allner 23.06.2015 12:32
quelle

Tags und Links