2017-01-26 2 views
1

Je remplaçais récemment certaines méthodes equals dans les objets de domaine de mon projet Java récent. Comme nous utilisons Sonar pour calculer nos métriques de code, j'ai immédiatement vu la complexité cyclomatique de ces classes augmenter au-dessus d'un seuil.Comment remplacer égal à égal sans augmenter la complexité cyclomatique?

Je me demande s'il y a une manière intelligente, un modèle ou une option du tout de garder cette métrique basse bien qu'ayant une méthode un peu plus complexe equals.

EDIT: Voici un de mes exemples que j'ai, rien de vraiment spécifique je dirais, juste pour que nous sachions de quoi nous parlons.

@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

Vous ne pouvez pas ajouter du code sans ajout de code, j'ai peur. Si la logique de la méthode surchargée est réutilisable, vous pouvez réduire l'augmentation totale en la réutilisant par héritage, mais il y aura toujours une augmentation. –

+0

Peut-être que vous devriez être moins esclave de Sonar. Si vous écrivez un mauvais code qui plaît à l'esprit robotique de Sonar, ce sera toujours un mauvais code. – Kayaman

+0

Je pense que vous pourriez essayer la méthode 'Objects.equals'. De cette façon, vous éliminerez les instructions supplémentaires if. – Enigo

Répondre

2

Vous pouvez utiliser la EqualsBuilder Apache:

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

Assez juste pour augmenter la complexité un peu – hecko84

+0

Normalement, la construction de nouveaux objets est déconseillée dans 'equals' et' hashcode'. La raison en est que pendant les opérations de recherche (par exemple dans un list.indexOf (...)) cette méthode est invoquée * plusieurs * fois, générant une pile d'objets de très courte durée. Il en résulte une pénalité de performance, qui est retardée au moment où le garbage collector entre en jeu. – JBM

+0

Ce n'est pas le cas avec les compilateurs JIT modernes. L'analyse de l'échappement devrait détecter qu'EqualsBuilder n'échappe pas à la portée de la fonction 'equals' et n'a donc pas besoin d'être allouée sur le tas. – john16384