1

示例

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

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


quietin
761 声望44 粉丝

兴趣在程序语言, 高性能, 分布式等方面