温馨提示×

温馨提示×

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

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

不可变类有哪些特点

发布时间:2026-07-16 10:10:56 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

不可变类(Immutable Class)是指对象一旦创建,其状态(成员属性)就不能被修改的类。
在 Java 等语言中,不可变类有非常明确的设计特点和用途。


一、不可变类的主要特点

1. 类本身不能被继承(防止被子类修改)

通常做法是:

  • 类用 final 修饰
public final class Person {
}

否则子类可能通过重写方法改变行为。


2. 所有成员变量都是 privatefinal

  • private:防止外部直接访问
  • final:保证变量只会被赋值一次
private final String name;
private final int age;

3. 不提供 setter 方法

只提供 getter(或干脆不提供),不提供任何能修改属性的方法

public String getName() {
    return name;
}

4. 通过构造方法初始化所有属性

对象的状态只能在创建时确定。

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

5. 如果属性是可变对象,必须进行防御性拷贝

这是最容易出错的一点

❌ 错误示例:

private final Date birthDate;

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

✅ 正确做法:

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

传入和返回可变对象时都要拷贝。


二、不可变类的优点

线程安全

  • 不需要加锁
  • 多个线程共享同一对象不会出问题

安全可控

  • 防止对象被意外或恶意修改

适合作为 Map 的 key、Set 的元素

  • HashCode 固定,不会出问题

易于缓存和复用

  • StringInteger 常量池

三、不可变类的缺点

频繁创建对象

  • 每次“修改”都会产生新对象

对性能敏感场景不友好

  • 大量临时对象会增加 GC 压力

四、经典不可变类示例

Java 中的不可变类

  • String
  • IntegerLong 等包装类
  • BigDecimal
  • LocalDateLocalDateTime

自定义不可变类示例

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

五、总结一句话

不可变类的核心特点:状态不可变、无 setter、类不可继承、属性 final、必要时进行防御性拷贝。

如果你愿意,我也可以对比 不可变类 vs 可变类,或者结合 String 为什么是不可变的 来讲。

向AI问一下细节

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

AI