实战小技巧10:不可变容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 不可变容器,看着好像在实际的业务中不怎么会用到,但实则不然,相信每个小伙伴都用过,或者看到过下面的代码

不可变容器,看着好像在实际的业务中不怎么会用到,但实则不然,相信每个小伙伴都用过,或者看到过下面的代码


Collections.emptyList();
Collections.emptyMap();
复制代码

今天我们来介绍一下如何使用不可变容器,以及使用时的注意事项


1. JDK不可变容器



java原生提供了一些不可变容器,它们最大的特点就是不支持添加、删除、修改容器内的值


Collections.emptyXxx空容器


Collections.emptyMap();
Collections.emptyList();
Collections.emptySet();
复制代码


上面三个是最常用的几个了,通常当我们一个方法的返回结果定义为容器类型时,可能为了避免npe,在返回空容器时,会如此使用


除了上面这几个空的不可变容器之外,还有


  • UnmodifiableList
  • UnmodifiableMap
  • UnmodifiableSet


它们的使用姿势,通常是借助Collections来实现


List<Integer> list = Collections.unmodifiableList(Arrays.asList(1, 2, 3));
复制代码


如上面创建的List,就不支持set/remove等修改操作

使用不可变容容器,最大的好处就是基于它的不可修改特性,来实现公用,且不会被污染


  • 所以一个自然而然能想到的应用场景就是 全局共享的配置


2. Guava不可变容器



上面是jdk提供的不可变容器,相比较与它们,在实际的项目中,使用Gauva的不可变容器的可能更多


  • ImmutableXxx;不可变容器
List<Integer> list = ImmutableList.of(1, 2, 3);
Set<Integer> set = ImmutableSet.of(1, 2, 3);
Map<String, Integer> map = ImmutableMap.of("hello", 1, "world", 2);
复制代码


上面是最常见的三个容器对应的不可变型

从使用角度来看,初始化非常方便(相比较与jdk版而言)


3. 注意事项



不可变容器虽好,但是使用不当也是很坑的;就我个人的一个观点


  • 如果是应用内的接口方法,容器传参,返回容器时,尽量不要使用不可变容器;因为你没办法保证别人拿到你的返回容器之后,会对它进行什么操作
  • 如果是对外提供返回结果,特别是null的场景,使用不可变的空容器优于返回null
  • 不可变容器,用于全局公用资源,共享配置参数;多线程的数据传递时,属于比较合适的场景



相关文章
|
22天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
48 3
实战~如何组织一个多容器项目docker-compose
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
119 7
|
2月前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
65 5
|
2月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
2月前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
108 0
|
2月前
|
存储 Cloud Native 开发者
深入探索容器化技术——Docker的实战应用
深入探索容器化技术——Docker的实战应用
42 0
|
2月前
|
JavaScript Linux 持续交付
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
60 0
|
2月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用