2017-01-26 5 views
1

Ich habe kürzlich einige equals Methoden in Domain-Objekten meines letzten Java-Projekts überschrieben. Da wir Sonar verwenden, um unsere Code-Metriken zu berechnen, sah ich sofort, dass die zyklomatische Komplexität dieser Klassen über einen Schwellenwert anstieg.Wie überschreiben Sie gleich, ohne die zyklomatische Komplexität zu erhöhen?

Ich frage mich, ob es einen cleveren Weg, Muster oder Option überhaupt gibt, um diese Metrik niedrig zu halten, obwohl ein wenig komplizierter equals Methode.

EDIT: Hier ist eines meiner Beispiele, die ich habe, nichts wirklich Spezifisches würde ich sagen, nur damit wir wissen, worüber wir reden.

@Override 
public boolean equals(Object o) { 
    if (o instanceof MyKey) { 
    MyKey other = (MyKey) o; 
    if (this.foo.longValue() == other.getFoo().longValue() && 
    this.bar.equalsIgnoreCase(other.getBar()) && 
    this.foobar.shortValue() == other.getFoobar().longValue()){ 
    return true; 
    } 
    } 
    return false; 
} 

@Override 
public int hashCode() { 
    int hash = 3; 
    hash = 53 * hash + foo.hashCode(); 
    hash = 53 * hash + bar.hashCode(); 
    hash = 53 * hash + foobar.hashCode(); 
    return hash; 
} 
+0

Sie können keinen Code hinzufügen, ohne Code hinzufügen, ich habe Angst. Wenn die Logik der überschriebenen Methode wiederverwendbar ist, können Sie die Gesamterhöhung reduzieren, indem Sie sie durch Vererbung wiederverwenden, aber es wird immer noch eine Erhöhung geben. –

+0

Vielleicht solltest du weniger ein Sklave von Sonar sein. Wenn du schlechten Code schreibst, der Sonars Robotergeist erfreut, wird es immer noch schlechter Code sein. – Kayaman

+0

Ich denke, Sie könnten versuchen, objects.equals' Methode. Auf diese Weise eliminieren Sie zusätzliche if-Anweisungen. – Enigo

Antwort

2

könnten Sie Apache Equals verwenden:

public boolean equals(Object obj) { 
    if (obj == null) { return false; } 
    if (obj == this) { return true; } 
    if (obj.getClass() != getClass()) { 
    return false; 
    } 
    MyClass rhs = (MyClass) obj; 
    return new EqualsBuilder() 
      .appendSuper(super.equals(obj)) 
      .append(field1, rhs.field1) 
      .append(field2, rhs.field2) 
      .append(field3, rhs.field3) 
      .isEquals(); 
} 
+0

Fair genug Option, um die Komplexität ein wenig zu erhöhen – hecko84

+0

Normalerweise wird das Konstruieren neuer Objekte innerhalb 'equals' und' hashcode' abgeraten. Der Grund dafür ist, dass während der Nachschlageoperationen (z. B. in einer list.indexOf (...)) diese Methode * mehrfach * aufgerufen wird, wodurch ein Stapel sehr kurzlebiger Objekte erzeugt wird. Dies führt zu einer Leistungseinbuße, die zu dem Zeitpunkt verzögert wird, zu dem der Garbage Collector auftritt. – JBM

+0

Das ist bei modernen JIT-Compilern nicht der Fall. Bei der Escape-Analyse sollte berücksichtigt werden, dass EqualsBuilder den Bereich der Funktion "equals" nicht verlässt und daher nicht auf dem Heap zugeordnet werden muss. – john16384

Verwandte Themen