java判断成员变量

王建观 发布于 03/18 22:51
阅读 682
收藏 1

在日常的java开发中,为了增加程序的健壮性,做好容错,我们常常在写方法的时候校验入参是否为null或者为“”;但是常常入参是一个对象,我常用的方式是

比如方法入参是Mail mail;

if (StringUtils.isEmpty(mail)) {
    return false;
}

使用的是spring的包,这样就确保了object不为null

但是常常我还需要判断对面内的某些成员变量也是否为null或者为“”

目前的做法是

if (StringUtils.isEmpty(mail) || StringUtils.isEmpty(mail.getHost()) || StringUtils.isEmpty(mail.getFrom()) || StringUtils.isEmpty(mail.getContent())) {
    return false;
}

这样我感觉显得代码较长,请问是否有什么方法解决这个问题?

加载中
1
大后锋
大后锋

用hibernate validator。一个注解@NotBlank

0
Eric_林
Eric_林

等java9吧,彻底解决npe

0
f
freezingsky

Optional.map   java8+支持

0
bosco_liao
bosco_liao

低版本JDK可以使用反射,更灵活,如果是高版本,则参照楼上的方法。

0
c
cxxyjsj

封装进方法,直接把Mail判断逻辑写进去,直接调方法

0
ZiFzzy
ZiFzzy

参数验证是基本,你验证成员变量,如果对象成员变量不常变,就自己封装方法验证,如果可能会变会扩展就反射更适用你对象的变化。

0
郭里奥

建议将if中的boolean值封装为一个校验的method,return boolean, 在方法中可以针对性的做校验

0
sprouting
sprouting

我都是直接封装成一个方法,然后调用这个工具类就行了

0
临风ivy
临风ivy

《阿里巴巴Java开发手册》推荐开发者使用JDK8的Optionall来避免NPE问题,如果是JDK8以下,可以引用google的guava库,guava库也提供了Optional的实现。具体参考https://jiges.github.io/2018/03/19/java8%E4%BD%BF%E7%94%A8Optional-API%E6%9D%A5%E9%81%BF%E5%85%8DNPE/

0
心境111
心境111

public static StringBuffer getResult(Object object,StringBuffer result,String msg) throws Exception{
        if(result == null){
            result = new StringBuffer();
        }
        Class sc = object.getClass();
        Field[] fieldArray = sc.getDeclaredFields();
        boolean valid = false;
        boolean notNull = false;
        List list = null;
        NotEmpty notEmpty = null;
        Length length = null;
        for(int i=0;i<fieldArray.length;i++){
            fieldArray[i].setAccessible(true);
            if(fieldArray[i].isAnnotationPresent(Valid.class)){
                valid = true; 
            }
            if(fieldArray[i].isAnnotationPresent(NotNull.class)){
                notNull = true;
            }
            if(valid){
                if(notNull && fieldArray[i].get(object) == null){
                    result.append(msg+fieldArray[i].getName()+" : 不能为null;");
                }else{
                    if(fieldArray[i].getType().equals(List.class)){
                        list = (ArrayList)fieldArray[i].get(object);
                        for(int j=0;j<list.size();j++){
                            result = CheckParamsConstant.getResult(list.get(j), result, fieldArray[i].getName()+"["+j+"].");
                        }
                    }else{
                        result = CheckParamsConstant.getResult(fieldArray[i].get(object), result, fieldArray[i].getName()+".");
                    }
                }
            }
            if(fieldArray[i].isAnnotationPresent(NotEmpty.class)){
                notEmpty = fieldArray[i].getAnnotation(NotEmpty.class);
                if(fieldArray[i].get(object) == null){
                    result.append(msg+fieldArray[i].getName()+" : "+notEmpty.message()+";");
                }
            }
            if(fieldArray[i].isAnnotationPresent(Length.class)){
                length = fieldArray[i].getAnnotation(Length.class);
                if(fieldArray[i].get(object) != null){
                    if(fieldArray[i].get(object).toString().length() < length.min()
                        || fieldArray[i].get(object).toString().length() > length.max()){
                        result.append(msg+fieldArray[i].getName()+" : "+length.message()+";");
                    }
                }
            }
            valid = false;
            notNull = false;
        }
        return result;
    }

根据注解如果bean里面的参数是基本类型,直接获取参数上的注解类型,然后返回对应的信息,如果bean对象是另外一个对象,判断是否为@volid,然后判断@notnull ,然后递归调用,第一个参数为类对象,第二个是返回的校验结果,第三个是如果对象是list,则加上前缀list0.msg不能为空,list0就是传入的参数,也可以是list1、list2其实就是list的第几个对象,目前只校验了Valid.class,NotNull.class,NotEmpty.class,Length.class如果有其它的校验可以自己把代码优化一下。

返回顶部
顶部