在 Java 中,**不可变对象(Immutable Object)**指的是:对象一旦被创建,其状态(字段值)就不能再被修改。
也就是说,这个对象在生命周期内始终保持创建时的状态。
一个典型的不可变对象通常满足以下条件:
类被 final 修饰
防止被继承,避免子类破坏不可变性。
所有字段都是 private 和 final
private:防止外部直接访问final:保证字段只会被赋值一次不提供 setter 方法
不允许修改对象状态。
对象中的引用类型字段也是不可变的,或不会被修改
如果字段是对象,需要:
对象创建时通过构造方法完成初始化
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;
}
}
✅ 这个对象:
name 和 age 不能改变finalpublic 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());
}
}
| 类 | 说明 |
|---|---|
String |
最典型的不可变对象 |
Integer、Long 等包装类 |
不可变 |
BigDecimal |
不可变 |
LocalDate、LocalDateTime |
Java 8 时间 API |
List.of() / Set.of() |
返回不可变集合 |
线程安全
不需要加锁,多个线程共享没问题。
缓存友好
如 String 常量池。
易于推理和调试
状态不会变化,逻辑更清晰。
适合作为 Map 的 key
不可变对象 hashCode 稳定。
频繁创建对象
每次修改都会生成新对象(如 String)。
有一定性能开销
在某些高频修改场景下不如可变对象。
Java 不可变对象是指:对象创建后其状态不能被修改,通常通过 final 类、final 字段、无 setter 和防御性拷贝来实现。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。