package com.demo.util;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
/**
* @Description: 校验对象是否为null
*/
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
*/
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
*/
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
* @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;
}
}
版权声明:本文为weixin_41908066原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。