温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java不可变类何时使用

发布时间:2026-09-11 07:38:11 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 中,不可变类(Immutable Class)是指对象一旦创建,其状态(字段值)就不能被修改的类(如 StringIntegerLocalDateTime 等)。

下面从什么时候该用、为什么用、不适合用的场景三个角度说明。


一、什么时候应该使用不可变类

1️⃣ 需要线程安全(并发场景)

不可变对象天然线程安全

  • 没有写操作
  • 不需要加锁
  • 可被多个线程共享

✅ 适合:

  • 并发编程
  • 缓存对象
  • 多线程共享配置
public final class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2️⃣ 作为 Map / Set 的 Key

如果对象作为 HashMap 的 key 或 HashSet 的元素:

  • 必须是不可变的
  • 否则修改后 hashCode 变化,导致找不到对象

✅ 适合:

  • 缓存 key
  • 业务主键对象
Map<UserId, UserInfo> cache;

3️⃣ 值对象(Value Object / DTO)

表示一个值或概念,而不是“会变化的状态”:

  • 金额(Money)
  • 坐标(Point)
  • 时间范围(Range)
  • 配置项

✅ 适合:

  • 领域模型中的 Value Object
  • API 返回值

4️⃣ 防止外部修改(防御性编程)

不希望调用方修改你的内部状态:

public List<String> getList() {
    return Collections.unmodifiableList(list);
}

或直接使用不可变类返回。


5️⃣ 函数式编程风格

  • 每次“修改”返回新对象
  • 避免副作用
LocalDate next = today.plusDays(1);

二、不可变类的典型特征

public final class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() { return x; }
    public int getY() { return y; }
}

关键点:

  • final class
  • private final 字段
  • 无 setter
  • 不暴露可变对象引用

三、不适合使用不可变类的场景

❌ 状态频繁变化的大对象
❌ 性能敏感且创建成本高
❌ 需要大量中间状态修改(如游戏实体、ORM 实体)

例如:

Entity User {
    age++; // 不适合不可变
}

四、总结一句话

当对象的“值”比“状态变化”更重要,且需要安全、稳定、可共享时,就用不可变类。

如果你愿意,我可以:

  • 给你一个可变 vs 不可变对比示例
  • 或讲 Java 中如何优雅写不可变类(含 Builder)
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI