如何降低方法的认知复杂性



我想降低以下方法的认知复杂性。怎么做呢?依我看,我不能,但我在这方面缺乏经验。

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (!(obj instanceof Bean)) return false;
Bean other = (Bean) obj;
if (property1== null) {
if (other.property1!= null) return false;
} else if (!property1.equals(other.property1)) return false;
if (property2== null) {
if (other.property2!= null) return false;
} else if (!property2.equals(other.property2)) return false;
if (property3== null) {
if (other.property3!= null) return false;
} else if (!property3.equals(other.property3)) return false;
if (property4== null) {
if (other.property4!= null) return false;
} else if (!property4.equals(other.property4)) return false;
return true;
}

您可以使用Java的Objects.equals轻松检查字段的相等性。如果两个给定对象相等或都是null,则返回true,否则返回false

if (this == obj) return true;
if (obj == null || this.getClass() != obj.getClass()) return false;
Bean other = (Bean) obj;
return Objects.equals(this.property1, other.property1)
&& Objects.equals(this.property2, other.property2)
&& ...;

作为一种替代方案,Apache CommonsEqualsBuilder也提供了一个reflectionEquals方法,自动从你的类中获取所有字段并进行比较。尽管这种方法可能会因为反射而变慢,并且您对发生的事情的控制较少。

可以实现具有equal方法的实用程序类,该方法接受Bean属性的getter作为变量:

public class Are {
static <T,R> boolean equal(T x1, T x2, Function<T, R> ... getters) {
return x1 == x2 || Arrays.stream(getters)
.allMatch(get -> Objects.equals(get.apply(x1), get.apply(x2)));
}
}

Bean::equals可以这样写:

// class Bean
@Override
public boolean equals(Object obj) {
if (obj == null || this.getClass() != obj.getClass()) {
return false;
}
Bean that = (Bean) obj;
return Are.equal(this, that, 
Bean::getProperty1, Bean::getProperty2, Bean::getProperty3, Bean::getProperty4
);
}

我假设Bean是您自己的类。你可以把property1property2等放到一个数组中。然后你的等号变成:

public boolean equals( Object obj )
{
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Bean))
return false;
Bean other = (Bean) obj;
for (int i = 0; i < properties.length; i++)
if (properties[i] == null)
{
if (other.properties[i] != null)
return false;
}
else if (!properties[i].equals( other.properties[i] ))
return false;
return true;
}

这也为您以后添加更多属性值提供了灵活性,而不必修改equals()方法。

相关内容

  • 没有找到相关文章

最新更新