Iterator null集合

卢声远*_* Lu 10 java collections iterator

在不确定集合引用是否为null时,我必须在迭代之前检查null是很常见的.样品:

Collection<Object> collection = ...
...
if(collection != null)//troublesome
    for(Object o : collection)
Run Code Online (Sandbox Code Playgroud)

当然,我知道空集合比null要好得多,但在某些情况下,客户端代码无法控制来自其他模块的可空集合(例如,从第三方代码返回值).所以我写了一个实用工具方法:

public static <T> Iterable<T> nullableIterable(Iterable<T> it){
    return it != null ? it : Collections.<T>emptySet();
}
Run Code Online (Sandbox Code Playgroud)

在客户端代码中,不再需要检查null:

for(Object o : nullableIterable(collection))
...
Run Code Online (Sandbox Code Playgroud)

你认为nullableIterable()合理吗?有什么建议?有顾虑吗?谢谢!

GET*_*Tah 6

看起来很好.我个人也这样做.你将永远得到那些不同意这一点的开发者,因为它是一种防御性编程.想象一下,你有一个工作流程或一个不应该返回的类null.这意味着null从中获取它是一个错误,您的代码将隐藏,因为它将转变null为空集合,并且该错误永远不会浮出水面.

如果您正在编写不支持null集合的API,那么您应该避免这种情况.如果客户端代码为您提供了null不支持它的集合,那么您应该抛出一个IllegalArgumentException让客户端代码知道提供的集合有问题.就像是:

public void myApiNoSupportForNull(Collection<Object> collection){
   // Pre condition
   if(collection == null) 
     throw new IllegalArgumentException("This API does not support null collections!");
   //...
}
Run Code Online (Sandbox Code Playgroud)