为什么Guava StandardTable put方法拒绝空值

时间:2018-08-16 08:21:17

标签: 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);

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

1 个答案:

答案 0 :(得分:1)

public function up() { Schema::create('campuses', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->text('address'); $table->timestamps(); }); } 通常被视为任何nullCollection中的键或值,被认为是错误的决定。 jdk本身有一些示例,Map不允许 不允许使用空键或空值,ConcurrentHashMap以及其他许多示例也不允许。

ConcurrentSkipListMap中添加的静态工厂方法也是如此,例如java-9。甚至{em}确实的Map::of都允许使用空键和空值,因此它们都不会失败:

HashMap

使用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); 集合都不是null容忍的,对我来说这是一个很好的决定。