如何判斷一個new出來的空對象


項目中經常會遇到,一個對象中有另外一個屬性DTO,當我們判斷這個DTO不為null的時候,我們會去做一些其他的操作,比如落入擴展屬性表,但是上游的調用方經常會new 一個新對象出來,這樣判斷出來不為null就是true,那么就會插入很多實際上不需要插入的數據庫記錄

怎么能判斷出來這個對象知識new出來的一個空對象呢,沒有任何一個屬性值

最先想到的辦法就是拿出來所有的屬性,判斷是否有值,那么如果針對每一個DTO的屬性單獨去寫,實際上做了很多重復的工作,那么寫一個util工具類,統一處理這類場景

邏輯就是用反射,拿出來所有的屬性,然后判斷,代碼如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.Collection;

/**
 * 判斷對象實體的屬性是否為空
 */
public class ObjectNullUtil {
    private final static Logger LOGGER = LoggerFactory.getLogger(ObjectNullUtil.class);

    public static boolean objectIsNull(Object obj) {
        if (obj == null) {
            return true;
        }
        //獲取所有屬性
        Field[] fields = obj.getClass().getDeclaredFields();
        if (fields == null || fields.length == 0) {
            return true;
        }
        boolean flag = true;
        for (Field field : fields) {
            //不檢查,設置可訪問
            field.setAccessible(true);
            try {
                if (field.get(obj) instanceof Collection) {
                    if (isNotNull((Collection) field.get(obj))) {
                        flag = false;
                        break;
                    }
                } else {
                    if (isNotNull(field.get(obj))) {
                        flag = false;
                        break;
                    }
                }
            } catch (Exception e) {
                LOGGER.error("ObjectNullUtil.objectIsNull校驗異常", e);
                flag = false;
            }
        }
        return flag;
    }

    public final static boolean isNull(Object obj) {
        if (obj == null || isNull(obj.toString())) {
            return true;
        }
        return false;
    }

    public final static boolean isNull(Collection collection) {
        if (collection == null || collection.size() == 0)
            return true;
        return false;
    }

    public final static boolean isNull(String str) {
        return str == null || "".equals(str.trim())
                || "null".equals(str.toLowerCase());
    }

    public final static boolean isNotNull(Collection collection) {
        return !isNull(collection);
    }

    public final static boolean isNotNull(Object obj) {
        return !isNull(obj);
    }


}

 

1.目前判斷了Oject和Collection類型的,如果有其他的,比如Map屬性,那么就需要加上對Map的父類AbstractMap做判斷

2.沒有做嵌套的邏輯判斷,比如說有一個屬性List<Student>,如果new了一個Student加到list中,那么對外層的DTO判斷就是不為空的了,這塊如果也想判斷的話,還需要加強


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM