【问题标题】:Why Guava StandardTable put method refuse null value为什么 Guava StandardTable put 方法拒绝空值
【发布时间】:2018-08-16 08:21:17
【问题描述】:

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方法将返回map包含特定类而不是null)

【问题讨论】:

  • 为什么?因为这就是设计师决定设计它的方式。通常应避免 Null,因为它是错误的巨大来源。请改用特殊值,或更改您的设计,或将您的值包装到 Optional 中。
  • 我考虑用一个特殊的值来代替,但是改变会影响很多代码,同样的是将值包装成 Optional
  • 如果影响了这么多代码,说明缺少封装。此表不应从任何地方公开访问,而应封装在一个类中。
  • 是的,同意。业务代码,你知道,很多开发人员都在处理它。所以我会再考虑一下,如果需要,修复这部分需要一些时间。但是,谢谢

标签: guava


【解决方案1】:

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

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

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 集合都不能容忍空值,这对我来说是一个很好的决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2021-11-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多