如何测试传递的对象是集合还是数组

时间:2015-12-29 09:03:43

标签: java

我有一个记录器类,这是它的一种方法:

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!=nullListMapSet进行此array检查是不够的,如果它们不为空,但它们为空。那么如何测试传递的对象是否包含sizelength,以便显示ERROR_PARAMETER_IS_NULL_OR_EMPTY消息?

3 个答案:

答案 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();
}