示例

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


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

ImmutableMap不可使用null的问题的更多相关文章

  1. Springboot实现VNC的反向代理

    背景 ​ 用户需要通过前端HTML页面的noVNC(noVNC是什么?)客户端连接底层VNC Server服务端,为了防止VNC Server的IP暴露,因此需要做一层代理.正常情况下使用Nginx. ...

  2. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  3. java ImmutableMap使用

    原文地址:https://blog.csdn.net/wantsToBeASinger/article/details/84997362 java中的Immutable对象: 简单地说,如果一个对象实 ...

  4. 使用ImmutableMap简化语句

    项目实战 最近接了一个出行权益的需求,回调的状态有十几种,需要转换为进行中,取消,已完成几种状态进行订单状态的展示,使用ImmutableMap可以简化语句,替代使用if-else 语句或者switc ...

  5. Java源码分析:Guava之不可变集合ImmutableMap的源码分析

    一.案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样-- public static final Map<String,String& ...

  6. 【小计】新人Tostring前忘记Null判断的处理

    ToString和string.Concat(可屏蔽Null的异常)性能相差不大,一些中小项目完全可以用Concat(新人容易忘记判断Null的情况,遇到太多了,所以建议重写tostring方法,内部 ...

  7. SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

    前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...

  8. 异步 HttpContext.Current 为空null 另一种解决方法

    1.场景 在导入通讯录过程中,把导入的失败.成功的号码数进行统计,然后保存到session中,客户端通过轮询显示状态. 在实现过程中,使用的async调用方法,出现HttpContext.Curren ...

  9. js中的null 和undefined

    参考链接:http://blog.csdn.net/qq_26676207/article/details/53100912 http://www.ruanyifeng.com/blog/2014/0 ...

随机推荐

  1. 移动端Web适配单位rem的坑,oppo r9手机出现错位bug

    我们做了一个抽奖的H5活动页面,被一个oppo R9手机客户反馈,抽奖的转盘错位了.刷新了好几次都不行.网上百度一搜真的有部分安卓手机有坑.赶紧修复bug.分享完整的rem.js代码出来.各位看官自己 ...

  2. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  3. 从登录接口的响应结果里提取token

    token一般存在于2个地方:1. cookie, 2 ,某个接口的响应结果中 1. 我们接口的token存在于登录接口的响应结果中,如下图: token值 为红色标记的值,在登录接口里加以下2行代码 ...

  4. IndentationError: expected an indented block错误

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  5. 观察者模式(Observer、Subject、ConcreteSubject、ConcreteObserver)(监护、订阅)

    建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应的作出反应. 在此发生改变的对象称之为观察目标(被观察者),而被通知的对象称为观察者,一个观察者目标可以对应多个观 ...

  6. LINUX软件包的安装、升级、删除

    1.安装和升级一个rpm 包: [root@localhost beinan]#rpm -vih file.rpm 注:这个是用来安装一个新的rpm 包: [root@localhost beinan ...

  7. Power Strings POJ2406 KMP 求最小循环节

    相比一般KMP,构建next数组需要多循环一次,因为next[j]代表前j-1个字符的最长相同前缀后缀,比如字符串为aab aab aab共9个字符,则next[10]等于前9个字符中最长相同前缀后缀 ...

  8. UVA1416/LA4080 Warfare And Logistics

    题目大意:有N个点,M条路,如果两条路不连通的话,就将这两条路的距离设置为L 现在要求你求出每两点之间的最短距离和 接着要求 求出炸断 给出的M条路中的一条路后,每两点之间的最短距离和的最大值(翻译来 ...

  9. JavaScript的基础应用

    <!DOCTYPE html> <!--JavaScript基础1--> <html lang="en"> <head> <m ...

  10. [转]深入理解ajax系列——进度事件

    一般地,使用readystatechange事件探测HTTP请求的完成.XHR2规范草案定义了进度事件Progress Events规范,XMLHttpRequest对象在请求的不同阶段触发不同类型的 ...