47

总结几乎说明了一切。这是相关的代码片段ImmutableList.createFromIterable()

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

我已经多次遇到这种情况,不明白为什么通用库函数应该施加这种限制。

编辑 1:通过“通用”,我会对 95% 的情况感到满意。但我认为我还没有写过 100 个调用ImmutableList.of(),并且不止一次被这个问题所困扰。不过,也许我是个异类。:)

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

4

4 回答 4

38

我在这个视频的 25 分钟时解释了这一点: https ://youtu.be/ZeO_J2OcHYM?t=1495

很抱歉这个懒惰的答案,但这毕竟只是一个“为什么”的问题(可以说不适合 StackOverflow?)。

编辑:还有一点我不确定我是否在视频中说清楚了:总数(世界上所有的 Java 代码),必须为那些对 null 友好的情况编写的额外代码量以使用旧备用Collections.unmodifiableList(Arrays.asList(...))checkArgument(!foos.contains(null))如果我们的集合没有为您解决这个问题,那么每个人都需要添加的额外调用的总数(在世界上所有的 Java 代码中)不堪重负。到目前为止,大多数情况下,集合的使用不希望出现任何空值,如果有的话,确实应该很快失败。

于 2010-02-12T17:12:05.937 回答
11

一般来说,在 Google Collections 中,开发人员属于不认为空值应该是预期的通用参数的群体。

于 2010-02-12T14:45:06.033 回答
0

来自Guava 的 Github 页面

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

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

// 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);
于 2021-06-23T04:14:09.240 回答
-2

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

于 2010-02-12T14:08:25.633 回答