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

  • 相关阅读:
    控制台——args参数的赋值方法
    整数排序的几种方法
    基于CentOS系统下的Oracle的安装
    QT的学习
    HDU 2104 hide handkerchief
    HDU 2103 Family Plan
    HDU 2115 I Love This Game
    HDU 2100 Lovekey
    猜数字游戏
    利用Hough变换识别图像中的直线
  • 原文地址:https://www.cnblogs.com/lovellll/p/10097647.html
Copyright © 2011-2022 走看看