示例
在项目中有发现类似下方的代码,
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也更方便.
如果想直接用允许Null的值的不可变map, 可以这样
MaptestMap = new HashMap<>();testMap.put("a", "1");Map immutableMap = Collections.unmodifiableMap(new HashMap<>(testMap));
此时不能直接更改key和value, 但如果value是对象, 其field可以修改
总结
简单总结一下, ImmutableMap的使用场景:
适合
- 确定性的配置, 比如根据不同的key值得到不同的请求url
- 写单元测试
不适合
- key, value为未知参数, 可能有null产生的情况
感受
上面的例子如果用HashMap
写, 不会有任何问题, 所以使用工具类时最好有一定了解, 不然可能会有一些意外问题出现.