2015-12-29 2 views
1

У меня есть класс лесоруба, и вот один из его методов:Как проверить это Переданный объект представляет собой коллекцию или массив

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?

+2

'instanceof Collection '? – Maroun

+0

- это массивы Collection , а? –

+2

Вы можете легко проверить это: Попробуйте. – Maroun

ответ

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

Чтобы ответить на более широкий вопрос:

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(); 
} 
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); 
    } 
} 
Смежные вопросы