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写, 不会有任何问题, 所以使用工具类时最好有一定了解, 不然可能会有一些意外问题出现.

posted @   lovollll  阅读(756)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
点击右上角即可分享
微信分享提示