2017-01-26 3 views
1

Я недавно переопределял методы equals в объектах домена моего недавнего проекта Java. Поскольку мы используем Sonar для вычисления наших метрик кода, я сразу увидел циклическую сложность этих классов, превышающую порог.Как переопределить равные без увеличения цикломатической сложности?

Мне интересно, есть ли уловка, шаблон или опция вообще, чтобы этот показатель был низким, хотя и имел более сложный метод equals.

EDIT: Вот один из моих примеров, который у меня есть, ничего конкретного, я бы сказал, просто чтобы мы знали, о чем мы говорим.

@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

Вы не можете добавить код без добавления кода, я боюсь. Если логика переопределенного метода многократно используется, вы можете уменьшить общее увеличение путем повторного использования его через наследование, но все равно будет увеличение. –

+0

Может быть, вы должны быть меньше раба для сонара. Если вы пишете плохой код, который радует робот-разум Сонара, он все равно будет плохим кодом. – Kayaman

+0

Я думаю, вы могли бы попробовать метод 'Objects.equals'. Таким образом, вы исключите дополнительные инструкции if. – Enigo

ответ

2

Вы можете использовать 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

Достаточно честный вариант, чтобы увеличить его сложность – hecko84

+0

Обычно создание новых объектов не рекомендуется внутри 'equals' и' hashcode'. Причиной этого является то, что во время операций поиска (например, в списке.indexOf (...)) этот метод вызывается * несколько раз, генерируя кучу очень короткоживущих объектов. Это приводит к штрафу за производительность, который задерживается до момента, когда сборщик мусора вступает в игру. – JBM

+0

Это не относится к современным компиляторам JIT. Анализ Escape должен поднять то, что EqualsBuilder не выходит за пределы функции 'equals' и поэтому не нужно выделять в куче. – john16384

Смежные вопросы