在 Java 里常说的“可变陷阱(mutability pitfalls)”,主要指对象状态可以被意外修改,从而导致:
下面从常见陷阱 → 避免方法 → 实战建议系统地讲。
class User {
private List<String> roles = new ArrayList<>();
public List<String> getRoles() {
return roles; // ❌ 外部可直接修改
}
}
调用方:
user.getRoles().add("ADMIN"); // 偷偷改了内部状态
✅ 避免方式:
public List<String> getRoles() {
return Collections.unmodifiableList(roles);
}
// 或
return List.copyOf(roles); // Java 9+
class Config {
private final List<String> list;
public Config(List<String> list) {
this.list = list; // ❌ 外部仍可改
}
}
✅ 正确写法:
this.list = List.copyOf(list);
// 或
this.list = new ArrayList<>(list);
List<String> key = new ArrayList<>();
map.put(key, "value");
key.add("x"); // ❌ hashCode 变了,再也找不到
✅ 原则:
String、Integer、record、enumpublic static List<String> CACHE = new ArrayList<>();
✅ 避免:
public static final List<String> CACHE =
Collections.unmodifiableList(new ArrayList<>());
或使用 ConcurrentHashMap + 明确线程安全策略
Date date = new Date();
user.setBirthday(date);
date.setTime(0); // ❌ 影响 user
✅ Java 8+ 推荐:
LocalDate
LocalDateTime
Instant
它们默认不可变
class Counter {
int count = 0;
}
✅ 解决:
final + 不可变对象AtomicIntegerStringIntegerrecord(Java 14+)List.of / Map.ofrecord Point(int x, int y) {}
class Order {
private final Long id;
private final List<Item> items;
}
规则:
原则一句话:
不要让外部拿到你内部对象的可写引用
List<String> safe = Collections.unmodifiableList(list);
或 Java 9+:
List.of("a", "b");
写 Java 时问自己:
Java 可变陷阱的本质是:你以为别人不会改,其实别人(或你自己)改了。
避免核心就三点:
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。