在 Java 中,“不可变(immutable)”对象是指一旦创建,其内部状态就不能被改变的对象。
简单回答是:不可变对象本身不能被修改,但“不可变”有一些细节和边界情况需要注意。
一个类如果是不可变的,通常满足以下条件:
final 修饰(防止被继承)final 修饰典型例子:
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; }
}
✅ Person 创建后,name 和 age 不能改。
Person p = new Person("Tom", 18);
// p.name = "Jerry"; // 编译错误
public final class A {
private final List<String> list;
public A(List<String> list) {
this.list = list; // ❌ 直接引用外部可变对象
}
public List<String> getList() {
return list; // ❌ 暴露可变引用
}
}
这样写:
List<String> l = new ArrayList<>();
A a = new A(l);
l.add("x"); // 外部修改,影响 a
✅ 正确做法(防御性拷贝):
this.list = new ArrayList<>(list);
return new ArrayList<>(list);
Field f = p.getClass().getDeclaredField("age");
f.setAccessible(true);
f.set(p, 99);
⚠️ 这是破坏不可变性,不推荐,也违背设计初衷。
private final int[] arr = {1,2,3};
数组内容仍可改:
arr[0] = 10; // ✅ 允许
String、Integer 等 JDK 不可变类List.of() / Set.of()(Java 9+)Collections.unmodifiableList()Java 中的不可变对象在正常使用下不能被修改,但如果设计不当(暴露可变引用、使用数组、反射等),仍可能被“间接修改”。
如果你愿意,我也可以帮你判断某个类是否真的不可变,或者把可变类改造成不可变类。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。