在 Java 中,**不可变对象(Immutable Object)**指的是:对象一旦被创建,其状态(字段值)就不能再被修改。也就是说,这个对象在生命周期内始终保持创建时的状态。
对象创建后状态不可变
所有字段通常是 final
对象内部状态不暴露可变引用
List、Date),需要防御性拷贝类通常是 final 的
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;
}
}
✅ 特点:
final class:不能被继承final 字段:赋值后不可改String 本身是不可变的public final class User {
private final Date birthDate;
public User(Date birthDate) {
this.birthDate = birthDate;
}
public Date getBirthDate() {
return birthDate; // 外部可修改 Date
}
}
Date 是可变的,外部可以修改它,破坏不可变性。
import java.util.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 s = "abc";
s = s + "d"; // 不是修改原对象,而是创建新对象
✅ 线程安全
✅ 缓存友好
✅ 易于推理和调试
✅ 适合作为 Map 的 key
String 常用作 key 的原因❌ 频繁创建对象
❌ 不适合频繁修改场景
✅ 解决方案:
| 对比项 | 不可变对象 | 可变对象 |
|---|---|---|
| 修改方式 | 创建新对象 | 修改原对象 |
| 线程安全 | 是 | 否(需同步) |
| 设计复杂度 | 低 | 高 |
| 性能 | 可能略低 | 通常更高 |
Java 不可变对象是指:对象创建后其内部状态无法被修改,通常通过 final 类、final 字段、无 setter 和防御性拷贝来实现。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。