10

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

Collection<Object> collection = ...
...
if(collection != null)//troublesome
    for(Object o : collection)

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

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

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

for(Object o : nullableIterable(collection))
...

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

4

3 回答 3

6

这看起来不错。我个人也是这样做的。您总会遇到不同意这一点的开发人员,因为它是一种防御性编程。想象一下,您有一个不应该返回的工作流或类null。这意味着null从中获取 a 是一个错误,您的代码将隐藏它,因为它将变成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!");
   //...
}
于 2012-07-07T08:41:20.577 回答
0

在大多数情况下,这是可以的。
请记住,您可能会遇到第三方在 error 的情况下返回 null ,并且空列表是有效的结果。
因此,我会考虑更改您的代码并执行以下操作:

public static <T> Iterable<T> nullableIterable(Iterable<T> it, boolean exceptionIfNull){
    if (exceptionIfNull && it == null) {
        throw new NUllPointerException("Iterable is null");
    } else
    return it != null ? it : Collections.<T>emptySet();
}

public static <T> Iterable<T> nullableIterable(Iterable<T> it){
    return nul,lableIterable(it,false); //Default behavior for most cases
}
于 2012-07-07T11:04:01.470 回答
0

如果您将此功能的使用限制在与“外部”代码交互的层并确保您永远不会开始使用它来防御自己或同事,这对我来说看起来不错。考虑使用 @Nullable 注释在代码中注释参数和字段 - 假设未注释的内容不能为空,这非常有用,特别是考虑到 IDE 和静态分析工具知道此注释。

于 2012-07-07T09:10:02.020 回答