为什么Guava StandardTable把方法拒绝为null值

问题描述 投票:1回答:1

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);

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

guava
1个回答
1
投票

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

java-9中添加静态工厂方法也是如此,例如Map::of。甚至HashMap确实允许null键和值,所以这些都不会失败:

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

使用java-8的任何新的HashMap方法将抛出NullPointerException

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

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

© www.soinside.com 2019 - 2024. All rights reserved.