在 Java 中,不可变对象(Immutable Object)指的是对象一旦被创建,其状态(字段值)就不能再被修改。常见的例子有 String、Integer、LocalDate 等。
不可变对象有很多好处,下面从核心优势、使用场景、设计注意点几个方面说明。
不可变对象是天然线程安全的:
// 多个线程同时读,不会有问题
String s = "hello";
✅ 非常适合并发编程,减少同步成本。
如果对象是可变的,为了防止外部修改,往往需要拷贝:
return new ArrayList<>(list);
而不可变对象可以直接返回引用:
return immutableObject;
✅ 更安全、更高效。
不可变对象可以:
Integer a = 100;
Integer b = 100;
// a 和 b 可能指向同一对象
✅ 减少对象创建,提高性能。
不可变对象:
user.setName("new"); // 如果是不可变对象,这种修改不存在
✅ 代码更清晰,Bug 更少。
不可变对象:
Map<String, String> map = new HashMap<>();
map.put("key", "value"); // String 不可变,安全
⚠️ 如果 key 是可变对象,修改后可能再也找不到值。
不可变对象更契合:
LocalDate date = LocalDate.now()
.plusDays(1)
.plusMonths(1);
✅ 代码更优雅、可组合。
要让一个类不可变,通常需要:
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 getName() {
return name;
}
public int getAge() {
return age;
}
}
| 缺点 | 说明 |
|---|---|
| 对象创建多 | 每次“修改”都会生成新对象 |
| 内存占用 | 频繁创建可能影响 GC |
| 不适合高频变化 | 如实时计数器 |
✅ 解决方案:
Java 不可变对象最大的好处是:简单、安全、高效(尤其是在并发环境)。
如果你愿意,我可以对比可变 vs 不可变在实际业务中的设计选择,或者结合 String 为什么不可变讲得更深入。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。