final vs immutable 在 Java 中:它们并不相同

发布: (2025年12月27日 GMT+8 12:30)
2 min read
原文: Dev.to

Source: Dev.to

关键概念

Final:阻止对引用的重新赋值,而不是阻止对内容的修改。如果对象是可变的,仍然可以对其进行操作。

不可变:对象在构造后不再改变。它不暴露修改器,并且如果包含集合,也不允许从外部修改。

示例

final 应用于可变集合

final List items = new ArrayList<>();
items.add("alpha"); // OK
// items = new ArrayList<>(); // Error: cannot assign a value to final variable

真正的不可变类

public final class UserId {
    private final String value;

    public UserId(String value) {
        this.value = value;
    }

    public String value() {
        return value;
    }
}

这样的一类不会暴露修改器,其状态在构造时即被固定。

实现真正不可变性的方式

  • 将字段声明为 privatefinal
  • 不包含 setter 方法。
  • 如果需要暴露可变数据,返回防御性拷贝或不可变集合(例如 Java 10+ 的 List.copyOf)。

推荐操作

检查返回可变 List 的 API。将方法改为返回不可变集合或其拷贝,并添加测试以验证消费者无法修改该列表。通过此调整,可获得更清晰、更安全的代码,减少生产环境中的意外。

Back to Blog

相关文章

阅读更多 »

我的 TicketDesk 系统

简介:在我的编程入门模块中,我用 Java 开发了一个 TicketDesk 系统,能够:- 跟踪工单 - 跟踪登录信息 - 提供基于角色的身份验证……