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

  • 相关阅读:
    CPU使用率呈现正弦曲线
    编写一个简单的http server(Linux, gcc)
    c#操作 文件操作
    Javascript 数字时钟
    .net 中读取文本文件
    c# 常用字符串函数
    I2C总线之(三)以C语言理解IIC
    典型的多线程操作界面的例子
    uvm_common_phase.svh
    uvm_task_phase.svh
  • 原文地址:https://www.cnblogs.com/lovellll/p/10097647.html
Copyright © 2011-2022 走看看