Java 空检查';圈复杂度的增加
我有一个JavaPOJO类,如下所示Java 空检查';圈复杂度的增加,java,string,exception,sonarqube,cyclomatic-complexity,Java,String,Exception,Sonarqube,Cyclomatic Complexity,我有一个JavaPOJO类,如下所示 public class EmployeeVo { private String firstName; private String middleName; private String lastName; private String suffix; private String addressline1; private String addressline
public class EmployeeVo {
private String firstName;
private String middleName;
private String lastName;
private String suffix;
private String addressline1;
private String addressline2;
private String city;
private String state;
private String zipCode;
private String country;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
.// Setters and getters for other fields.
.
.
}
有没有办法一次检查对象的所有字段是否为null,而不是检查每个字段是否为null
从EmployeeVo对象检索这些值时
public static boolean isEmpty(String string){
if(null==string || string.trim().length()==0){
return true;
}
return false;
}
在某些地方使用之前,我必须手动检查每个字段的空值。
由于上面的对象有10多个字段,这显然会增加该方法的圈复杂度。
有什么最佳的解决方案吗
if(CommonUtil.isNotEmpty(employeeVO.getCity())){
postalAddress.setCity(employeeVO.getCity());
}
if(CommonUtil.isNotEmpty(employeeVO.getCity())){
postalAddress.setState(employeeVO.getState());
}
if(CommonUtil.isNotEmpty(employeeVO.getZipCode())){
postalAddress.setPostalCode(employeeVO.getZipCode());
}
if(CommonUtil.isNotEmpty(employeeVO.getCountry())){
postalAddress.setCountryCode(employeeVO.getCountry());
}
我们可以使用
String country=employeeVO.getCountry();
postalAddress.setCountryCode( (country!=null) ? country: "");
只是为了减少复杂性?这是否符合标准?调用者不负责决定是否设置字段,而应该是自己的方法 在您的情况下,这意味着设置者必须决定参数的值是否设置
这会将一个方法的复杂性转移到单个方法,从而降低调用者的复杂性此代码不会降低CC。使用三元时仍有一个分支
String country=employeeVO.getCountry();
postalAddress.setCountryCode( (country!=null) ? country: "");
我想出了一个简单的方法来处理这个问题
ifNotBlank(String input, String output);
如果输入为空,则返回输出。如果输入不为空,则返回输入。因此,当应用到代码时,它看起来是这样的
postalAddress.setCity(ifNotBlank(employeeVO.getCity(), ""));
postalAddress.setState(ifNotBlank(employeeVO.getState(), ""));
postalAddress.setPostalCode(ifNotBlank(employeeVO.getZipCode(), ""));
postalAddress.setCountryCode(ifNotBlank(employeeVO.getCountry(), ""));
import org.apache.commons.lang3.StringUtils;
public class ComplexityUtils{
public static String ifNotBlank(String input, String output){
return StringUtils.isBlank(input) ? output : input;
}
}
ifNotBlank的代码如下所示
postalAddress.setCity(ifNotBlank(employeeVO.getCity(), ""));
postalAddress.setState(ifNotBlank(employeeVO.getState(), ""));
postalAddress.setPostalCode(ifNotBlank(employeeVO.getZipCode(), ""));
postalAddress.setCountryCode(ifNotBlank(employeeVO.getCountry(), ""));
import org.apache.commons.lang3.StringUtils;
public class ComplexityUtils{
public static String ifNotBlank(String input, String output){
return StringUtils.isBlank(input) ? output : input;
}
}
非常相关:你能有一个
searchVO
和postalAddress
都使用的“address”对象吗?它的employeeVO实际上,Tunaki你发布的链接说如果(something!=null){this.something=something;}但是,如果我们不使用setterCan设置该字段,那么该字段仍然是空的,我们可以使用字符串country=employeeVO.getCountry();postalAddress.setCountryCode((国家!=null)?国家:);您的意思是Setter方法中的空检查?是-决定字段是否获得值集的责任应该在该字段的类内部,而不是外部,因此空检查(以及可能的其他检查)应该在Setter方法中。这也减少了每个调用者进行所有检查的问题,您当前有if(CommonUtil.isNotEmpty(employeeVO.getCity()){postalAddress.setState(employeeVO.getState());}
我建议的只是postalAddress.setState(employeeVO.getState())在setState
中,如果(CommonUtil.isNotEmpty(state)){this.state=state;}
实际存在于Jar文件中,那么它就是if(CommonUtil.isNotEmpty(state)){this.state=state;}
。所以我们不能改变setState方法。我们可以使用字符串country=employeeVO.getCountry();postalAddress.setCountryCode((国家!=null)?国家:);让我试试这个,用声纳扫描!在这种情况下,这是个好主意,因为根据纳伊姆的说法,邮资代码是不能更改的。但是,如果可以更改,则应该在PostLadAddress对象内部调用更改。每个类都应负责保持其数据的有效性。爱默生·科德指出了这一点