目录
1.是什么
2.为什么
3.怎么做
4.构造详细的不可变类示例:
5.补充
5.1 Java标准库中的不可变类
5.2 构造不可变类进阶
1.对象包含嵌套的引用类型字段
2. 大型对象采用不可变类时,需考虑性能影响。
2.1 内存占用问题
2.2 垃圾回收压力
2.3 复制开销
2.4 优化策略
3.应用时机
3.1 适合使用不可变类的情况
3.2 不适合使用不可变类的情况
3.3 权衡
1.是什么
不可变类是指在创建后其状态(对象的属性)无法被修改的类。一但对象被创建,它的所有属性都不能被更改
2.为什么
最主要的好处是可以保证线程安全,但同时也带来了频繁修改会浪费资源
3.怎么做
1.声明类为final。
防止子类被继承
2.类的所有属性都是private和final。确保所有属性在初始化完成后不能被修改
3.不提供任何修改对象属性的方法,比如 setter
4.如果类包含引用类型字段,确保这些字段在构造函数中进行深拷贝,并且返回可变对象的防御性拷贝
import java.util.Collections;import java.util.List;public final class ImmutableClass {private final List<String> items;public ImmutableClass(List<String> items) {this.items = Collections.unmodifiableList(new ArrayList<>(items));}public List<String> getItems() {return items;}}
4.构造详细的不可变类示例:
import java.util.Collections;import java.util.Date;import java.util.List;public final class Person {private final String name;private final Date birthDate;private final List<String> hobbies;public Person(String name, Date birthDate, List<String> hobbies) {this.name = name;this.birthDate = new Date(birthDate.getTime());this.hobbies = Collections.unmodifiableList(new ArrayList<>(hobbies));}public String getName() {return name;}public Date getBirthDate() {return new Date(birthDate.getTime());}public List<String> getHobbies() {return hobbies;}}
在这个
Person
类中,我们确保birthDate
和hobbies
字段都是不可变的。对于birthDate
,我们在构造函数和getter方法中使用了深拷贝。对于hobbies
,我们使用了Collections.unmodifiableList
方法来创建不可变的列表视图。