我有一个记录器类,这是它的一种方法:
public static void i(String tag, Object message) {
if (message != null) {
i(tag, message.toString());
} else {
i(tag, ERROR_PARAMETER_IS_NULL_OR_EMPTY);
}
}
对message!=null
,List
,Map
或Set
进行此array
检查是不够的,如果它们不为空,但它们为空。那么如何测试传递的对象是否包含size
或length
,以便显示ERROR_PARAMETER_IS_NULL_OR_EMPTY
消息?
答案 0 :(得分:4)
您可以使用Class.isArray()
:
public static boolean isArray(Object obj)
{
return obj!=null && obj.getClass().isArray();
}
也适用于具有基本类型的数组。
您可以使用Class.isAssignableFrom(Class<?> cls)
检查对象是否是Collection
的实例:
public static boolean hasSize(Object obj)
{
return obj!=null && Collection.class.isAssignableFrom(obj.getClass());
}
答案 1 :(得分:2)
您可以通过重载方法并提供Iterable
版本来完全避免测试。
// Shouldn't really use raw types here.
public static void i(String tag, Iterable messages) {
if (messages != null) {
/*
Probably need a bit more than this
as String.join takes an `Iterable<? extends CharSequence>
but that is not an insurmountable problem.
*/
i(tag, "["+String.join(",", messages)+"]");
} else {
i(tag, ERROR_PARAMETER_IS_NULL_OR_EMPTY);
}
}
public static void i(String tag, Object message) {
if (message != null) {
i(tag, message.toString());
} else {
i(tag, ERROR_PARAMETER_IS_NULL_OR_EMPTY);
}
}
答案 2 :(得分:1)
回答更广泛的问题:
static boolean isEmptyArray(Object o) {
if (o == null || !o.getClass().isArray()) {
return false;
}
if (o instanceof int[]) {
return ((int[])o).length == 0;
} else if (o instanceof long[]) {
return ((long[])o).length == 0;
} else if (o instanceof double[]) {
return ((double[])o).length == 0;
} else if (o instanceof byte[]) {
return ((byte[])o).length == 0;
} else if (o instanceof char[]) {
return ((char[])o).length == 0;
} else if (o instanceof boolean[]) {
return ((boolean[])o).length == 0;
} else if (o instanceof float[]) {
return ((float[])o).length == 0;
} else if (o instanceof short[]) {
return ((short[])o).length == 0;
} else { // it is an array, so it can only be an object array now.
return ((Object[])o).length == 0;
}
}
static boolean isEmptyCollection(Object o) {
return (o instanceof Collection) && ((Collection)o).isEmpty();
}