Java 空检查';圈复杂度的增加

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

我有一个JavaPOJO类,如下所示

 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对象内部调用更改。每个类都应负责保持其数据的有效性。爱默生·科德指出了这一点