当前位置: 首页 > news >正文

篇章三 基础——不可变类

目录

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类中,我们确保birthDatehobbies字段都是不可变的。对于birthDate,我们在构造函数和getter方法中使用了深拷贝。对于hobbies,我们使用了Collections.unmodifiableList方法来创建不可变的列表视图。

http://www.xdnf.cn/news/650323.html

相关文章:

  • 工信部中文点选验证码识别
  • Engineering a direct k-way Hypergraph Partitioning Algorithm【2017 ALENEX】
  • 基于JWT+Redis的登录流程实现
  • 分布式ID
  • 解决虚拟机挂起后,docker容器无法访问的问题
  • Qt6无法识别OpenCV(Windows端开发)
  • 【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信
  • 七、【前端路由篇】掌控全局:Vue Router 实现页面导航、动态路由与权限控制
  • 2025/5/26 学习日记 基本/扩展正则表达式 linux三剑客之grep
  • [ARM][架构] 02.AArch32 程序状态
  • 3DVR拍摄指南:从理论到实践
  • [特殊字符] next-intl 服务端 i18n getTranslations 教程
  • 三分钟了解 MCP 概念(Model Context Protocol,模型上下文协议)
  • CLAM完整流程。patches-feature-split-train-eval
  • 5.26 面经整理 360共有云 golang
  • Java大师成长计划之第31天:Docker与Java应用容器化
  • 基于matlab版本的三维直流电法反演算法
  • 论文阅读: 2023 NeurIPS Jailbroken: How does llm safety training fail?
  • 支持selenium的chrome driver更新到136.0.7103.113
  • C++寻位映射的究极密码:哈希扩展
  • ubuntu 22.04 配置静态IP、网关、DNS
  • 鸿蒙OSUniApp 实现的日期选择器与时间选择器组件#三方框架 #Uniapp
  • 对数的运算困惑
  • 鸿蒙OSUniApp 开发带有通知提示的功能组件#三方框架 #Uniapp
  • Linux《基础IO》
  • 深入Java TCP流套接字编程:高效服务器构建与高并发实战优化指南​
  • Kafka自定义分区策略实战避坑指南
  • 论文阅读笔记:YOLO-World: Real-Time Open-Vocabulary Object Detection
  • nginx安全防护与https部署实战
  • 简述各类机器学习问题