在 Java 中,不可变类(Immutable Class)是指对象一旦创建,其状态(字段值)就不能再被修改的类(如 String、Integer、LocalDateTime 等)。是否使用不可变类,取决于安全性、并发性、可维护性与业务语义。
下面从应该使用不可变类的场景、不适合的场景以及设计要点三个角度说明。
不可变对象天生线程安全,不需要加锁或同步。
✅ 适用场景:
final class Point {
private final int x;
private final int y;
// 只有 getter,没有 setter
}
多个线程同时读,不会有并发问题。
如果对象作为 HashMap 的 key,必须不可变,否则:
Map<UserId, User> map;
UserId 就应该是不可变类。
当对象表示的是一个值,而不是一个可变实体时:
MoneyPointDateRangeConfigclass Money {
private final BigDecimal amount;
private final Currency currency;
}
返回内部对象时,防止被调用方修改:
public UserSnapshot getUser() {
return new UserSnapshot(name, age);
}
而不是返回可变实体。
LocalDate next = date.plusDays(1);
例如:
如果每次修改都创建新对象,会有:
如 ORM 实体类(JPA Entity):
@Entity
class Order {
private Status status;
// 需要频繁变更
}
不可变 = 新建对象
在高频循环中需谨慎。
final(防止子类破坏不可变性)private finalList、Date)要防御性拷贝public final class Student {
private final String name;
private final List<String> courses;
public Student(String name, List<String> courses) {
this.name = name;
this.courses = List.copyOf(courses); // 防御拷贝
}
public List<String> getCourses() {
return courses; // 已是不可变 List
}
}
当对象表示的是“值”而不是“状态机”,或者需要在并发中被安全共享时,就用不可变类。
如果你愿意,我也可以:
record免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。