为什么ImmutableList.of()和朋友禁止null元素?

Mat*_*nry 40 java collections guava

摘要几乎说明了一切.以下是相关的代码片段ImmutableList.createFromIterable():

  if (element == null) {
    throw new NullPointerException("at index " + index);
  }
Run Code Online (Sandbox Code Playgroud)

我已经多次遇到这种情况,并且无法理解为什么通用库函数应该强加这个限制.

编辑1:通过"通用",我对95%的案例感到满意.但我认为我还没有写过100个电话ImmutableList.of(),并且不止一次被这个电话咬过.不过,也许我是一个离群值.:)

编辑2:我猜我最大的抱怨是,当与标准java.util集合交互时,这会产生"打嗝" .正如您在演讲中指出的那样,null集合中s的问题可能会显示在远离插入这些空值的位置.但是,如果我有一长串代码在一端将空值放在标准集合中并在另一端正确处理它们,那么我无法在整个过程中的任何时候替换谷歌集合类,因为它会立即抛出一个NullPointerException.

Kev*_*ion 36

我在这段视频的25分钟点解释了这一点:http: //www.youtube.com/watch?v = ZeO_J2OcHYM

很抱歉这个懒惰的答案,但这毕竟只是一个"为什么"的问题(可能不适合StackOverflow?).

编辑:这是另一个问题我不知道我做的视频清晰:总(横跨世界上所有的Java代码),即对那些空友好的情况下被写入额外的代码量使用旧备用Collections.unmodifiableList(Arrays.asList(...))checkArgument(!foos.contains(null))如果我们的产品系列没有为您处理,那么每个人都需要添加的额外调用量会超出总数(在所有世界Java代码中).大多数情况下,通过FAR,集合的用法不会期望存在任何空值,并且如果有的话,真的应该快速失败.

  • 首先,谁告诉你不要将null放入集合中?如果您需要,因为我们Google员工需要大约5%的时间(我们仔细研究过),只需使用支持它的集合.其次,做出了选择,这个问题询问为什么做出选择.因为你不喜欢这个选择,你真的有意义地回答这个问题吗?它仍然是问题的答案. (27认同)
  • -1.不要告诉我应该或不应该放入我的藏品中.Null通常在我的列表中有效.我很少想在集合或映射中使用空值,但是如果我想要防止空元素,我还可以使用很多其他工具. (14认同)
  • 我怀疑如果需要“看视频”来解释,那肯定是胡说八道。 (3认同)

Yis*_*hai 7

通常在Google Collections中,开发人员属于不相信null应该是预期的通用参数的组.