资讯专栏INFORMATION COLUMN

ImmutableMap不可使用null的问题

fuyi501 / 1024人阅读

摘要:示例在项目中有发现类似下方的代码实际运行时偶尔出现错误原因在于对应的值为而的和均不可为值特别是对于的问题在对应的中有讨论官方建议使用的方式来包装在不允许用值的情况下也更方便除外包括等其它组件也是不允许这点需要注意如果想直接用允许的值的不可变

示例

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

 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 testMap = new HashMap<>();
testMap.put("a", "1");

Map immutableMap = Collections.unmodifiableMap(new HashMap<>(testMap)); 

此时不能直接更改key和value, 但如果value是对象, 其field可以修改

总结

简单总结一下, ImmutableMap的使用场景:

适合

确定性的配置, 比如根据不同的key值得到不同的请求url

写单元测试

不适合

key, value为未知参数, 可能有null产生的情况

感受

上面的例子如果用HashMap写, 不会有任何问题, 所以使用工具类时最好有一定了解, 不然可能会有一些意外问题出现.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77347.html

相关文章

  • [译]JavaScript中不可变性(Immutability)

    摘要:整个这个雷区面板都是由的和组成的,最后由的方法对其进行不可变化处理剩下的主要逻辑部分就是扫雷了,传入扫雷游戏对象一个不可变结构做为第一个参数,以及要扫的那个雷区块对象,最后返回新的扫雷游戏实例。 不可变性(Immutability)是函数式编程的核心原则,在面向对象编程里也有大量应用。在这篇文章里,我会给大家秀一下到底什么是不可变性(Immutability)、她为什么还这么屌、以及在...

    clasnake 评论0 收藏0
  • RESTful & “优雅”API 响应结构设计

    摘要:概述一个规范易懂和优雅,以及结构清晰且易于理解的响应结构,完全可以省去许多无意义的沟通和文档。 概述 一个规范、易懂和优雅,以及结构清晰且易于理解的API响应结构,完全可以省去许多无意义的沟通和文档。 预览 操作成功: { status: true, timestamp: 1525582485337 } 操作成功:返回数据 { status: true, ...

    MingjunYang 评论0 收藏0
  • 有用guava(一)

    摘要:尼古拉斯沃兹基硕德我们已经有了,为什么还需要另外一个库呢因为好用呗日常编码中经常会遇到下面的代码经过的修剪后可以变成这样甚至这样其实这种结构,就是一个二维映射,把它包装成了。但的完美处理双向映射。当然,在使用时,会要求的唯一性。 Google Guava是把小巧又锋利的瑞士军刀,把你的代码修剪得整洁又漂亮。-------------尼古拉斯·沃兹基硕德 1. Google Collec...

    张宪坤 评论0 收藏0
  • 微信支付服务端开发总结

    摘要:前言最近应公司业务需求,把微信支付完成了,当然已经顺利上线。第三步查询订单该接口提供所有微信支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。 前言 最近应公司业务需求,把微信支付完成了,当然已经顺利上线。但是开发的过程是也是踩了很多坑,下面我就先说说开发流程,以及在开发中遇到的大大小小的坑。 开发流程 首先,看一下微信开方平台关于支付的一个时序图,如下: sh...

    马忠志 评论0 收藏0
  • 自己整理java编程规范

    摘要:努力避免硬编码。一个类的总体行数尽量控制在行左右不超过一千行。函数注释函数注释采用,在每个函数或者过程的前面要有必要的注释信息,包括函数或过程名称功能描述输入输出及返回值说明调用关系及被调用关系说明等。 前言 推荐Google的Java编码规范英文版: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然...

    yedf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<