在 Java 中,**不可变对象(Immutable Object)**是指对象一旦创建,其状态(字段值)就不能再被修改。保证 Java 对象不可变通常遵循以下原则和做法:
final 修饰(防止继承破坏不可变性)public final class ImmutableClass {
}
private final 修饰private final int value;
private final String name;
private:外部无法直接访问final:引用一旦赋值不能更改setXxx() 方法public ImmutableClass(int value, String name) {
this.value = value;
this.name = name;
}
如果字段是可变对象(如 Date、List、数组):
private final Date date;
public ImmutableClass(Date date) {
this.date = date; // 外部仍可修改
}
private final Date date;
public ImmutableClass(Date date) {
this.date = new Date(date.getTime());
}
public Date getDate() {
return new Date(date.getTime());
}
private final List<String> list;
public ImmutableClass(List<String> list) {
this.list = List.copyOf(list); // Java 9+
}
public List<String> getList() {
return list; // 已经是不可变集合
}
this 引用(防止构造泄漏)// 错误
public ImmutableClass() {
someMethod(this);
}
import java.util.Date;
import java.util.List;
public final class User {
private final String name;
private final int age;
private final Date birthday;
private final List<String> roles;
public User(String name, int age, Date birthday, List<String> roles) {
this.name = name;
this.age = age;
this.birthday = new Date(birthday.getTime());
this.roles = List.copyOf(roles);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Date getBirthday() {
return new Date(birthday.getTime());
}
public List<String> getRoles() {
return roles;
}
}
public record Point(int x, int y) {}
finalequals/hashCode/toString@Value
public class Config {
String key;
int timeout;
}
@Value = 不可变类如果你有具体场景(如 DTO、配置类、并发对象),我可以给你更针对性的建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。