Java 迭代器空集合

Java 迭代器空集合,java,collections,iterator,Java,Collections,Iterator,当不确定集合引用是否为null时,在迭代之前必须检查null是很常见的。 样本: 你认为nullableIterable()合理吗?有什么建议吗?有什么问题吗?谢谢 看起来不错。我个人也这么做。你总是会遇到不同意这一点的开发人员,因为这是一种防御性编程。假设您有一个工作流或类不应该返回null。这意味着从中获取null是一个bug,您的代码将隐藏它,因为它将null变成一个空集合,并且该bug永远不会出现 例如,如果您正在编写不支持null集合的API,那么应该避免这种情况。如果客户端代码向您提

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


你认为
nullableIterable()
合理吗?有什么建议吗?有什么问题吗?谢谢

看起来不错。我个人也这么做。你总是会遇到不同意这一点的开发人员,因为这是一种防御性编程。假设您有一个工作流或类不应该返回
null
。这意味着从中获取
null
是一个bug,您的代码将隐藏它,因为它将
null
变成一个空集合,并且该bug永远不会出现

例如,如果您正在编写不支持
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!");
   //...
}
public void myApiNoSupportForNull(集合){
//前提条件
if(集合==null)
抛出新的IllegalArgumentException(“此API不支持空集合!”);
//...
}

如果您将此功能的使用限制在与“外部”代码交互的层上,并确保您永远不会开始使用它来防御您自己或同事的攻击,那么我觉得这很好。
考虑用“nulLable注释”注释代码中的参数和字段——假设没有注释的内容不能为空,特别有用,特别是考虑到IDE和静态分析工具意识到这种注释。

< P>在大多数情况下,这是可以的。BR> 请记住,您可能会遇到第三方在出现错误时返回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
}
public static Iterable nullableiterrable(Iterable it,boolean exceptionIfNull){
if(例外fnull&&it==null){
抛出新的NUllPointerException(“Iterable为null”);
}否则
返回它!=null?它:Collections.emptySet();
}
公共静态Iterable nullableIterable(Iterable it){
返回nul,lableiTrable(it,false);//大多数情况下的默认行为
}

是的,我也这样做。我的方法被称为
nullSafe()
…@LukasEder nullSafe()返回什么默认Iterable实例?我在实用程序类中重载了
nullSafe(List)
nullSafe(Set)
,等等。。。但是您的想法也很有效,因为您只公开了
Iterable
类型。具体的
Iterable
实现对于调用站点来说并不重要,如果有人选择通过忽略空值来进行代码防御,这里是一个很好的方法。因此,我应该告诉客户机代码如何使用该方法,并注意陷阱。我可能为该方法编写了一些Javadoc。或者抛出一个
IllegalArgumentException
并返回,这样客户端代码就会知道您不支持
null
集合有些人可能会这样争论,是的。但有些API设计为“支持”
null
和空列表。以
File.list()
为例。在某些情况下,它可以返回
null
,这不一定是错误。注意:对于某些API,如果语义是相同的,那么接受
null
作为空集合的替代品可能会很方便same@LukasEder我完全同意你的看法。这一切都取决于您公开的API。为什么您声称这是一个bug?我有这样的设计,我认为集合并不是为了性能而初始化的。为什么它是一只虫子?
for(Object o : nullableIterable(collection))
...
public void myApiNoSupportForNull(Collection<Object> collection){
   // Pre condition
   if(collection == null) 
     throw new IllegalArgumentException("This API does not support null collections!");
   //...
}
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
}