Java 需要不可变类(Immutable Class),核心原因在于:不可变对象更安全、更简单、更容易在并发和多模块系统中正确使用。下面从多个角度系统说明。
不可变类指:对象一旦创建,其状态(字段值)就不能再被修改。
典型特征:
final 修饰(不能被继承)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 name() { return name; }
public int age() { return age; }
}
不可变对象是天然线程安全的
synchronized、volatile// 多线程安全
User user = new User("Tom", 18);
✅ 这是 Java 并发编程中最简单、最可靠的线程安全模型之一
可变对象容易被意外修改:
user.setAge(20); // 谁改的?什么时候改的?
不可变对象:
✅ 减少隐藏 Bug,尤其是大型系统
不可变对象:
Map<User, String> map = new HashMap<>();
map.put(user, "value"); // 安全
如果 User 是可变的,key 一旦变化,Map 就坏了。
Java 标准库中大量使用不可变类:
| 类 | 用途 |
|---|---|
String |
字符串 |
Integer |
包装类 |
LocalDate |
日期 |
BigDecimal |
数值 |
Optional |
容器 |
如果 String 可变:
不可变对象:
public User getUser() {
return user; // 安全
}
可变对象往往需要:
return new User(user); // 防御性拷贝
不可变对象非常适合函数式风格:
User updated = user.withAge(20);
✅ 强烈推荐使用场景:
❌ 不适合:
Java 需要不可变类,是因为它用最简单的方式解决了并发安全、对象共享、程序可预测性和设计复杂度的问题。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。