从脆弱到坚固:用 Guava ImmutableList 替代 Arrays.asList 的终极指南

图片[1]-从脆弱到坚固:用 Guava `ImmutableList` 替代 `Arrays.asList` 的终极指南

ImmutableList.of(...) 是与 ImmutableSet.of(...) 来自同一个库(Google Guava)的孪生兄弟,专门用于创建 不可变的列表

让我们来详细分析一下您写的这行代码:

ImmutableList.of(
   BudgetUsageTypeEnum.FROZEN.getValue(),
   BudgetUsageTypeEnum.UNFROZEN.getValue()
)

1. 这行代码的含义和优势 (在 Java 8 环境下)

这行代码创建了一个包含两个元素(FROZENUNFROZENvalue)的、真正不可变 的列表。它相对于 Arrays.asList() 是一个巨大的升级:

  1. 真正的不可变性 (True Immutability):
    • Arrays.asList() 不同,你 不能 通过 set(index, element) 来修改列表中的内容。
    • 任何 add, remove, set, clear 等修改操作都会抛出 UnsupportedOperationException
    • 这使得它在并发环境和作为 API 返回值时非常安全。
  2. 保持顺序 (Order is Preserved):
    • 作为 List,它会严格保持你传入元素的顺序。FROZEN 的值会在索引 0UNFROZEN 的值会在索引 1
  3. 高性能和低内存占用:
    • Guava 对 ImmutableList 同样做了大量优化。创建少量元素的列表时,它会使用内部的紧凑实现,比创建一个 ArrayList 更高效。
  4. 不允许 null 元素:
    • 与 Guava 其他不可变集合一样,如果在创建时传入 null,它会立即抛出 NullPointerException,帮助你尽早发现问题。

2. 与 Arrays.asList() 的直接对比

让我们将您的提议与原始方案进行对比,这能清晰地展示其优越性。

特性Arrays.asList(...)ImmutableList.of(...) (Guava)
不可变性部分不可变 (陷阱!) 不可 add/remove,但可 set() 修改完全不可变 任何修改操作都失败
来源JDK 标准库Google Guava 库 (需添加依赖)
线程安全不是 (因为可被修改) (因为不可变)
null 处理允许 null 元素不允许 null 元素 (会抛异常)
代码意图“将数组视为列表”“创建一个永不改变的列表”
适用场景内部实现,临时适配公共常量,API返回值,多线程共享

结论: 在 Java 8 中,使用 Guava 的 ImmutableList.of() 来代替 Arrays.asList() 是一个典型的代码优化和健壮性提升。

3. 如何在 Java 8 项目中使用它?

要让 ImmutableList.of(...) 这行代码能够编译和运行,你只需要确保你的项目中已经添加了 Google Guava 的依赖。

如果你使用 Maven,请在 pom.xml 文件中加入:

<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>32.1.2-jre</version> <!-- 建议使用最新的稳定版本 -->
</dependency>

总结

  • 对于 Java 8 项目ImmutableList.of(...) 是创建不可变列表的 最佳实践(前提是你可以引入 Guava 库)。它完美地解决了 Arrays.asList() 的各种缺陷。
  • 对于 Java 9+ 项目:你应该优先使用 JDK 原生的 List.of(...)。它的功能和优点与 Guava 的 ImmutableList.of() 几乎完全相同,但无需引入任何外部依赖。
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享