guava - 为什么Guava StandardTable put方法拒绝null值

标签 guava

Guava StandardTable 类重写 AbstractTable 的 put 方法

// in AbstractTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
  return row(rowKey).put(columnKey, value);
}

// in StandardTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
  checkNotNull(rowKey);
  checkNotNull(columnKey);
  checkNotNull(value);
  return getOrCreate(rowKey).put(columnKey, value);
}

我创建表使用

Tables.newCustomTable(Maps.newLinkedHashMap(), Maps::newHashMap);

我的代码在某些情况下会将空值设置到表中,但是gauva会在put方法中抛出异常,困惑 如何实现具有可为空值的标准表? (我尝试实现ForwardingTable,重写get/put方法,使用特定类替换null值,但这还不够,例如:row方法将返回包含特定类而不是null的map)

最佳答案

null 通常被视为任何 CollectionMap 中的键或值,被视为错误的决定。 jdk本身有一些例子,ConcurrentHashMap不允许允许空键或值,ConcurrentSkipListMap和许多其他的也是如此。

java-9 中添加的静态工厂方法也是如此,例如 Map::of。即使 HashMap 确实允许 null 键和值,因此它们都不会失败:

HashMap<String, String> map = new HashMap<>();
map.put("", null);
map.put(null, "");

使用 HashMap 的任何新 java-8 方法都会抛出 NullPointerException:

 // value trying to be null
 chm.merge("", null, (k, v) -> k);

最后一点是所有 guava 集合都不是空容忍的,这对我来说是一个很好的决定。

关于guava - 为什么Guava StandardTable put方法拒绝null值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872623/

相关文章:

java - 如何在谷歌 Guava 事件总线中处理具有相同参数的多个监听器

java - 让 Guava 在 GWT 上工作

java - guava-11.0.1.jar 和 eclipse 的 Maven 插件

java - ImmutableMap 是大量键/对象/的次优选择吗?

java - java android中的ArrayList groupby基于没有java 8流和lambda的相同属性

java - guava的cacheloader加载方法有更多参数吗?

caching - 有人如何异步使用 Guava 的 CacheLoader

java - Java/Guava 异步编程

java - 如何在不同的 web 应用程序中使用 EventBus 共享事件?

java - 合并两个 Guava 多重贴图