在 Java 中,**不可变类(Immutable Class)**指的是:对象一旦创建,其内部状态就不能被修改。典型的不可变类有 String、Integer、LocalDate 等。
下面从实现原则 → 标准写法 → 示例 → 注意事项 → 常见面试点系统讲解。
final 修饰(防止被继承)public final class Person {
}
private final 修饰private final String name;
private final int age;
private:外部无法直接访问final:赋值后不能再修改只提供 getter(或根本不提供,直接暴露只读字段)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
这是最容易出错的地方。
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;
}
}
✅ 特点:
class Address {
public String city;
}
public final class Person {
private final Address address;
public Person(Address address) {
this.address = address;
}
public Address getAddress() {
return address; // 外部可修改 Address
}
}
❌ 外部可以改 address:
Address a = new Address();
Person p = new Person(a);
a.city = "Beijing"; // 破坏了不可变性
class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
}
public final class Person {
private final Address address;
public Person(Address address) {
this.address = new Address(address.getCity()); // 拷贝
}
public Address getAddress() {
return new Address(address.getCity()); // 返回拷贝
}
}
✅ 关键:
public final class Person {
private final String name;
private Person(String name) {
this.name = name;
}
public static Person of(String name) {
return new Person(name);
}
}
✅ 好处:
✅ 线程安全(无需 synchronized)
✅ 可缓存(如 String 常量池)
✅ 易于推理、调试
✅ 适合作为 Map 的 key(如 String)
❌ 频繁创建对象
✅ 解决:
不可变类需要:
1️⃣ final 类
2️⃣ final 字段
3️⃣ 无 setter
4️⃣ 构造初始化
5️⃣ 对可变对象进行防御性拷贝
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。