我想降低以下方法的认知复杂性。怎么做呢?依我看,我不能,但我在这方面缺乏经验。
@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
是您自己的类。你可以把property1
、property2
等放到一个数组中。然后你的等号变成:
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()
方法。