在Java中验证null和空集合的最佳实践

Best practice to validate null and empty collection in Java

我想验证一个集合是否为空,以及null。有人能告诉我最佳做法吗?

目前,我检查如下:

1
2
3
4
5
6
if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
}
else {
  // do something else
}


如果在项目中使用Apache Commons Collections库,则可以使用CollectionUtils.isEmptyMapUtils.isEmpty()方法,分别检查集合或映射是空的还是空的(即它们是"空安全的")。

这些方法背后的代码或多或少就是user@icza在其答案中所写的代码。

不管您做什么,记住编写的代码越少,随着代码复杂性的降低,需要测试的代码就越少。


这是最好的检查方法。您可以编写一个助手方法来执行此操作:

1
2
3
4
5
6
7
public static boolean isNullOrEmpty( final Collection< ? > c ) {
    return c == null || c.isEmpty();
}

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}


如果您使用Spring框架,那么可以使用CollectionUtils检查集合(列表、数组)和映射等。

1
if(CollectionUtils.isEmpty(...)) {...}

就我个人而言,我更喜欢使用空集合而不是null,并且让算法以这样的方式工作:对于算法来说,集合是否为空并不重要。


使用弹簧时,可以使用

1
boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

其中obj是任何[map,collection,array,aythink…]

否则:代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static boolean isEmpty(Object[] array) {
    return (array == null || array.length == 0);
}

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

对于字符串,最好是:

1
boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

您可以使用org.apache.commons.lang.Validate的"notEmpty"方法:

Validate.notEmpty(myCollection)->验证指定的参数集合既不是空值,也不是零大小(无元素);否则引发异常。


如果您需要检查是否为空,这就是方法。但是,如果您对此有控制权,那么只要您可以,只要返回空集合,稍后只检查空集合。

这个线程和C是一样的,但是这些原理同样适用于Java。如前所述,只有在

  • null might mean something more specific;
  • your API (contract) might force you to return null.

对于所有集合,包括映射使用:这些集合对象上的IsEmpty方法。但是你必须先检查一下

地图地图;

……如果(地图)!=空!图IsIvType()……