在 Java 中,“不可变(Immutable)”通常指对象一旦创建,其状态(字段值)就不能被修改。常见的不可变类有 String、Integer、以及 Java 新引入的 Record。
下面系统地讲一下 Java 不可变对象的实现方式、原理和注意事项。
一个不可变对象通常满足以下几点:
private final(只能赋值一次)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;
}
}
✅ 特点:
final class:不能被继承final 字段:只能赋值一次String(天然不可变)class Address {
public String city;
}
final class User {
private final Address address;
public User(Address address) {
this.address = address; // 直接引用外部对象
}
public Address getAddress() {
return address;
}
}
⚠️ 问题:
Address 是可变的address.city,User 就变了class Address {
private String city;
public Address(Address other) {
this.city = other.city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
final class User {
private final Address address;
public User(Address address) {
this.address = new Address(address); // 拷贝
}
public Address getAddress() {
return new Address(address); // 返回拷贝
}
}
✅ 关键点:
public final class String {
private final char value[];
}
原因:
final classprivate final char[]public record User(String name, int age) {}
✅ 自动具备:
final 类final 字段equals / hashCode / toString⚠️ 注意:
| 优点 | 说明 |
|---|---|
| 线程安全 | 无需加锁 |
| 可缓存 | 如 String 常量池 |
| 易推理 | 状态不会变化 |
| 适合 HashMap / HashSet | hashCode 稳定 |
Java 不可变对象通过 final 类、final 字段、无 setter、构造器初始化,并对可变对象进行防御性拷贝来实现。
如果你愿意,我可以:
String vs StringBuffer免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。