Java 基本类型非null 公用方法Validator

package com.able.util;


import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;

/**
 * <b>核心类</b>,判断对象是否为null或者Empty.
 * 
 * <ol>
 * <li>{@link #isNullOrEmpty(Object)} 判断对象是否是null或者空</li>
 * <li>{@link #isNotNullOrEmpty(Object)}判断对象是否不是null或者不是空</li>
 * </ol>
 * 
 * <h3>对于empty的判断,使用以下逻辑/语法/规则:</h3>
 * 
 * <blockquote>
 * <ol>
 * <li>{@link Collection},使用其 {@link Collection#isEmpty()};</li>
 * <li>{@link Map},使用其 {@link Map#isEmpty()};</li>
 * <li>{@link String},使用 {@link String#trim()}{@code .length()<=0}效率高;</li>
 * <li>{@link Enumeration},使用 {@link Enumeration#hasMoreElements()};</li>
 * <li>{@link Iterator},使用 {@link Iterator#hasNext()};</li>
 * <li><code>Object[]</code>,判断length==0;注:二维数组不管是primitive 还是包装类型,都instanceof Object[];</li>
 * <li><code>byte[]</code>,判断length==0;</li>
 * <li><code>boolean[]</code>,判断length==0;</li>
 * <li><code>char[]</code>,判断length==0;</li>
 * <li><code>int[]</code>,判断length==0;</li>
 * <li><code>short[]</code>,判断length==0;</li>
 * <li><code>float[]</code>,判断length==0;</li>
 * <li><code>double[]</code>,判断length==0;</li>
 * </ol>
 * </blockquote>
 * 
 * @see String#trim()
 * @see Map#isEmpty()
 * @see Collection#isEmpty()
 * @see Enumeration#hasMoreElements()
 * @see Iterator#hasNext()
 * @since 1.0.0
 */
public final class Validator{

    /** Don't let anyone instantiate this class. */
    private Validator(){
        //AssertionError不是必须的. 但它可以避免不小心在类的内部调用构造器. 保证该类在任何情况下都不会被实例化.
        //see 《Effective Java》 2nd
        throw new AssertionError("No " + getClass().getName() + " instances for you!");
    }

    /**
     * 判断对象是否为Null或者Empty
     * 
     * <h3>对于empty的判断,使用以下逻辑/语法/规则:</h3>
     * 
     * <blockquote>
     * <ol>
     * <li>{@link Collection},使用其 {@link Collection#isEmpty()};</li>
     * <li>{@link Map},使用其 {@link Map#isEmpty()};</li>
     * <li>{@link String},使用 {@link String#trim()}{@code .length()<=0}效率高;</li>
     * <li>{@link Enumeration},使用 {@link Enumeration#hasMoreElements()};</li>
     * <li>{@link Iterator},使用 {@link Iterator#hasNext()};</li>
     * <li><code>Object[]</code>,判断length==0;注:二维数组不管是primitive 还是包装类型,都instanceof Object[];</li>
     * <li><code>byte[]</code>,判断length==0;</li>
     * <li><code>boolean[]</code>,判断length==0;</li>
     * <li><code>char[]</code>,判断length==0;</li>
     * <li><code>int[]</code>,判断length==0;</li>
     * <li><code>short[]</code>,判断length==0;</li>
     * <li><code>float[]</code>,判断length==0;</li>
     * <li><code>double[]</code>,判断length==0;</li>
     * </ol>
     * </blockquote>
     * 
     * @param value
     *            可以是Collection,Map,String,Enumeration,Iterator,以及所有数组类型
     * @return 如果是null,返回true<br>
     *         如果是empty也返回true<br>
     *         其他情况返回false<br>
     *         如果不是上述类型,不判断empty,返回false
     * @see org.apache.commons.collections.CollectionUtils#isEmpty(Collection)
     * @see org.apache.commons.collections.CollectionUtils#isNotEmpty(Collection)
     * @see org.apache.commons.collections.MapUtils#isEmpty(Map)
     * @see org.apache.commons.collections.MapUtils#isNotEmpty(Map)
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(byte[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(boolean[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(char[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(int[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(long[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(short[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(float[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(double[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(Object[])
     * @see org.apache.commons.lang.StringUtils#isBlank(String)
     * @see org.apache.commons.lang.StringUtils#isEmpty(String)
     */
    public static final boolean isNullOrEmpty(Object value){
        if (null == value){
            return true;
        }
        // *****************************************************************************

        // 字符串
        if (value instanceof String){// 比较字符串长度, 效率高
            return value.toString().trim().length() <= 0;
        }

        // 集合
        if (value instanceof Collection){
            return ((Collection<?>) value).isEmpty();
        }

        // map
        if (value instanceof Map){
            return ((Map<?, ?>) value).isEmpty();
        }

        // 枚举
        if (value instanceof Enumeration){
            return !((Enumeration<?>) value).hasMoreElements();
        }

        // Iterator迭代器
        if (value instanceof Iterator){
            return !((Iterator<?>) value).hasNext();
        }

        boolean arrayFlag = arrayIsNullOrEmpty(value);
        if (arrayFlag){
            return true;
        }
        // 这里可以扩展
        return false;
    }

    /**
     * 判断对象是否不为Null或者Empty,调用 !{@link #isNullOrEmpty(Object)} 方法 <br>
     * 
     * <h3>对于empty的判断,使用以下逻辑/语法/规则:</h3>
     * 
     * <blockquote>
     * <ol>
     * <li>{@link Collection},使用其 {@link Collection#isEmpty()};</li>
     * <li>{@link Map},使用其 {@link Map#isEmpty()};</li>
     * <li>{@link String},使用 {@link String#trim()}{@code .length()<=0}效率高;</li>
     * <li>{@link Enumeration},使用 {@link Enumeration#hasMoreElements()};</li>
     * <li>{@link Iterator},使用 {@link Iterator#hasNext()};</li>
     * <li><code>Object[]</code>,判断length==0;注:二维数组不管是primitive 还是包装类型,都instanceof Object[];</li>
     * <li><code>byte[]</code>,判断length==0;</li>
     * <li><code>boolean[]</code>,判断length==0;</li>
     * <li><code>char[]</code>,判断length==0;</li>
     * <li><code>int[]</code>,判断length==0;</li>
     * <li><code>short[]</code>,判断length==0;</li>
     * <li><code>float[]</code>,判断length==0;</li>
     * <li><code>double[]</code>,判断length==0;</li>
     * </ol>
     * </blockquote>
     * 
     * @param value
     *            可以是Collection,Map,String,Enumeration,Iterator,以及所有数组类型
     * @return 如果是null,返回false<br>
     *         如果是空也返回false<br>
     *         其他情况返回true<br>
     *         如果不是上述类型,不判断empty,返回true
     * @see org.apache.commons.collections.CollectionUtils#isEmpty(Collection)
     * @see org.apache.commons.collections.CollectionUtils#isNotEmpty(Collection)
     * @see org.apache.commons.collections.MapUtils#isEmpty(Map)
     * @see org.apache.commons.collections.MapUtils#isNotEmpty(Map)
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(byte[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(boolean[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(char[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(int[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(long[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(short[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(float[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(double[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(Object[])
     * @see org.apache.commons.lang.StringUtils#isBlank(String)
     * @see org.apache.commons.lang.StringUtils#isEmpty(String)
     */
    public static final boolean isNotNullOrEmpty(Object value){
        return !isNullOrEmpty(value);
    }

    /**
     * 数组 类型的验证,区分 primitive 和包装类型.
     * 
     * @param value
     *            可以是
     *            <ul>
     *            <li>Object[] 二维数组属于这个类型</li>
     *            <li>byte[]</li>
     *            <li>boolean[]</li>
     *            <li>char[]</li>
     *            <li>int[]</li>
     *            <li>long[]</li>
     *            <li>short[]</li>
     *            <li>float[]</li>
     *            <li>double[]</li>
     *            </ul>
     * @return 如果是数组类型(区分 primitive和包装类型),判断其length==0;<br>
     *         如果不是 直接返回false
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(byte[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(boolean[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(char[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(int[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(long[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(short[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(float[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(double[])
     * @see org.apache.commons.lang.ArrayUtils#isEmpty(Object[])
     * @since 1.0.7
     */
    private static boolean arrayIsNullOrEmpty(Object value){
        // ***********************************************************
        // 数组 Integer/String...自定义的对象User.等数组也 instanceof Object[]
        if (value instanceof Object[]){
            return ((Object[]) value).length == 0;
        }

        // ***********************************************************
        // primitive ints
        if (value instanceof int[]){
            return ((int[]) value).length == 0;
        }

        // primitive long
        if (value instanceof long[]){
            return ((long[]) value).length == 0;
        }

        // primitive float
        if (value instanceof float[]){
            return ((float[]) value).length == 0;
        }

        // primitive double
        if (value instanceof double[]){
            return ((double[]) value).length == 0;
        }

        // primitive char
        if (value instanceof char[]){
            return ((char[]) value).length == 0;
        }

        // primitive boolean
        if (value instanceof boolean[]){
            return ((boolean[]) value).length == 0;
        }

        // primitive byte
        if (value instanceof byte[]){
            return ((byte[]) value).length == 0;
        }

        // primitive short
        if (value instanceof short[]){
            return ((short[]) value).length == 0;
        }
        return false;
    }
}

猜你喜欢

转载自bugyun.iteye.com/blog/2356739