ImmutableMap不可使用null的问题

示例

在项目中有发现类似下方的代码,

 Map tmpParams = ImmutableMap.of(
                "extraInfos", ext.get("extraInfos"),
                "otherParams" , ImmutableMap.builder()
                    .put("version" , 0)
                    .put("orderId" , MapUtils.getString(ext,"orderId");

实际运行时偶尔出现npe错误, 原因在于orderId对应的值为null, 而ImmutableMap的key和value均不可为null值.

特别是对于null vlaues的问题, 在guava对应的github issue中有讨论

官方建议使用Optional的方式来包装, 在不允许用null值的情况下inline/stream也更方便.
除ImmutableMap外, 包括LoadingCache等其它guava组件也是不允许null vlaues, 这点需要注意.

如果想直接用允许Null的值的不可变map, 可以这样

Map<String, String> testMap = new HashMap<>();
testMap.put("a", "1");

Map<String, String> immutableMap = Collections.unmodifiableMap(new HashMap<>(testMap)); 

此时不能直接更改key和value, 但如果value是对象, 其field可以修改

总结

简单总结一下, ImmutableMap的使用场景:

适合

  1. 确定性的配置, 比如根据不同的key值得到不同的请求url
  2. 写单元测试

不适合

  1. key, value为未知参数, 可能有null产生的情况
感受

上面的例子如果用HashMap写, 不会有任何问题, 所以使用工具类时最好有一定了解, 不然可能会有一些意外问题出现.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值