温馨提示×

温馨提示×

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

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

Java不可变对象是什么

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

在 Java 中,**不可变对象(Immutable Object)**指的是:对象一旦被创建,其状态(字段值)就不能再被修改
也就是说,这个对象在生命周期内始终保持创建时的状态。


一、不可变对象的特征

一个典型的不可变对象通常满足以下条件:

  1. 类被 final 修饰
    防止被继承,避免子类破坏不可变性。

  2. 所有字段都是 privatefinal

    • private:防止外部直接访问
    • final:保证字段只会被赋值一次
  3. 不提供 setter 方法
    不允许修改对象状态。

  4. 对象中的引用类型字段也是不可变的,或不会被修改
    如果字段是对象,需要:

    • 使用不可变对象
    • 或返回对象的拷贝(防御性拷贝)
  5. 对象创建时通过构造方法完成初始化


二、一个简单的不可变对象示例

public final class Person {
    private final String name;
    private final int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

✅ 这个对象:

  • 创建后 nameage 不能改变
  • 没有 setter
  • 字段是 final

三、包含引用类型时的注意事项(重点)

❌ 错误示例(可变风险)

public final class User {
    private final Date birthDate;

    public User(Date birthDate) {
        this.birthDate = birthDate;
    }

    public Date getBirthDate() {
        return birthDate; // 外部可以修改 Date
    }
}

Date 是可变对象,外部可以修改它,破坏了不可变性。


✅ 正确写法(防御性拷贝)

public final class User {
    private final Date birthDate;

    public User(Date birthDate) {
        this.birthDate = new Date(birthDate.getTime());
    }

    public Date getBirthDate() {
        return new Date(birthDate.getTime());
    }
}

四、Java 中常见的不可变对象

说明
String 最典型的不可变对象
IntegerLong 等包装类 不可变
BigDecimal 不可变
LocalDateLocalDateTime Java 8 时间 API
List.of() / Set.of() 返回不可变集合

五、不可变对象的优点

  1. 线程安全
    不需要加锁,多个线程共享没问题。

  2. 缓存友好
    String 常量池。

  3. 易于推理和调试
    状态不会变化,逻辑更清晰。

  4. 适合作为 Map 的 key
    不可变对象 hashCode 稳定。


六、不可变对象的缺点

  1. 频繁创建对象
    每次修改都会生成新对象(如 String)。

  2. 有一定性能开销
    在某些高频修改场景下不如可变对象。


七、总结一句话

Java 不可变对象是指:对象创建后其状态不能被修改,通常通过 final 类、final 字段、无 setter 和防御性拷贝来实现。

如果你愿意,我可以:

  • 对比 不可变对象 vs 可变对象
  • String 为什么设计成不可变
  • 如何设计一个“尽量不可变”的对象
向AI问一下细节

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

AI