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

时间:2010-02-12 14:05:24

标签: java collections guava

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

  if (element == null) {
    throw new NullPointerException("at index " + index);
  }

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

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

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

4 个答案:

答案 0 :(得分:35)

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

对于懒惰的回答感到抱歉,但这毕竟只是一个“为什么”的问题(可能不适合StackOverflow?)。

编辑:这是另一点我不确定我在视频中明确指出:总数(在世界上所有的Java代码中),必须为这些代码编写的额外代码量如果我们的集合没有,那么使用旧的备用Collections.unmodifiableList(Arrays.asList(...))等的无效案例会被全部(在全世界所有Java代码中)的额外checkArgument(!foos.contains(null))个调用量所淹没为你照顾好。大多数情况下,通过FAR,集合的用法不会出现任何空值,如果有的话,真的应该快速失败。

答案 1 :(得分:7)

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

答案 2 :(得分:0)

一个原因是它允许在列表上工作的函数不必检查Null的每个元素,从而显着提高性能。

答案 3 :(得分:0)

来自Guava's Github Page

<块引用>

不小心使用 null 会导致各种各样的错误。研究 Google 代码库后,我们发现 95% 的集合中不应该包含任何 null 值,让这些集合快速失败而不是默默地接受 null 会对开发人员有所帮助。

Guava 的立场主要是,还有其他方法可以避免集合中的 null。例如,使用特定键获取一批项目。例如

// If a widget for the given id does not exist, return `null` in the list
private List<Widget> getWidgets(List<String> widgetIds);

// Could be restructured to use a Map type like this and avoids nulls completely.

// If a widget for the given id does not exist, no entry in list
private Map<String, Widget> getWidgets(List<String> widgetIds);