2016-11-06 38 views
0

我想创建一个方法,检查每个对象的值是空的。如果输入对象是null然后return true;。如果输入是数组类型,请检查它的长度。下面是我的方法来实现这个逻辑如何检查原始空数组

public static boolean isEmpty(Object input) { 
    if (input == null) { 
     return true; 
    } 
     if (input instanceof Collection) { 
     if (((Collection<?>) input).size() == 0) { 
      return true; 
     } 
    } 
    if (input instanceof String) { 
     if (((String) input).trim().length() == 0) { 
      return true; 
     } 
    } 
    if (input instanceof Object[]) { 
     if (((Object[]) input).length == 0) { 
      return true; 
     } 
    } 
    return false; 
} 

但问题是,当我作为这样

int[] a = {}; 
float[] b = {}; 
Integer[] c = {}; 
Float[] d = {}; 
System.out.println(Validator.isEmpty(a)); 
System.out.println(Validator.isEmpty(b)); 
System.out.println(Validator.isEmpty(c)); 
System.out.println(Validator.isEmpty(d)); 

我不知道为什么abfalse测试。有人可以解释我吗?

+2

*“我不知道为什么A和B都是假的。” *你有没有检查了当你执行'new float [0] instanceof Object []'时得到了什么? –

+1

这种方法有特定的原因吗?你有没有考虑过使用三种不同的'isEmpty'方法,它们采用不同的类型参数? – pathfinderelite

+0

@ T.J.Crowder糟糕!我得到了'不兼容的条件操作数类型float []和Object []' – Cataclysm

回答

5

float[]不是instanceof Object[]。如果你想检查所有类型的数组,你可能想从对象中获取类并检查它的方法isArray。然后你可以使用Array.getLength,以获取其长度(因为,奇怪的是,你不能使用Class#getField得到length场):

import java.lang.reflect.*; 

class Validator { 
    public static void main(String args[]) throws Exception { 
     int[] a = {}; 
     float[] b = {}; 
     Integer[] c = {}; 
     Float[] d = {}; 
     System.out.println(Validator.isEmpty(a));   // true 
     System.out.println(Validator.isEmpty(b));   // true 
     System.out.println(Validator.isEmpty(c));   // true 
     System.out.println(Validator.isEmpty(d));   // true 
     System.out.println(Validator.isEmpty(new float[3])); // false (just double-checking) 
    } 

    public static boolean isEmpty(Object input) { 
     if (input == null) { 
      return true; 
     } 
     if (input instanceof String) { 
      if (((String) input).trim().length() == 0) { 
       return true; 
      } 
     } 
     if (input.getClass().isArray()) { 
      return Array.getLength(input) == 0; 
     } 
     return false; 
    } 
} 
+0

非常感谢代码示例。在这之前,我仍然很担心'如何改变我的方法'。 – Cataclysm

+0

@Cataclysm:是的,事实证明它比我所期望的更加痛苦......我并不期待'Class#getField'拒绝给我一个数组的'length'字段(尽管它在原来的文档)。 –