Java中创建不可变对象实现细节和例子

当我们在Java中创建不可变对象时,我们需要确保对象的状态在创建之后不能被修改。以下是一些具体的实现细节和例子,展示了如何在Java中创建不可变对象。

实现细节

  1. 使用final关键字
    • 类定义前使用final关键字,表示该类不能被继承,从而防止子类覆盖其方法或添加新的状态。
    • 字段前使用final关键字,表示该字段的值在初始化之后不能被修改。
  2. 不提供修改器方法
    • 不提供任何setter方法,确保外部类不能通过公共接口修改对象的状态。
  3. 构造函数中初始化所有字段
    • 在构造函数中初始化所有final字段,并确保一旦初始化,它们就不会被再次赋值。
  4. 确保引用的对象也是不可变的
    • 如果字段是引用类型,则需要确保引用的对象本身也是不可变的,或者字段引用的是不可变的集合(如Collections.unmodifiableList)。
  5. 返回不可变集合的视图
    • 如果类包含集合类型的字段,并且需要对外提供访问接口,可以返回该集合的不可变视图,以防止外部类修改集合内容。

例子

简单的不可变类
 

java复制代码

public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 其他方法(如果有的话)...
@Override
public String toString() {
return "ImmutablePerson{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
引用不可变对象的类
 

java复制代码

public final class ImmutableAddress {
private final String street;
private final String city;
private final String country;
public ImmutableAddress(String street, String city, String country) {
this.street = street;
this.city = city;
this.country = country;
}
// Getter方法...
@Override
public String toString() {
return "ImmutableAddress{" +
"street='" + street + '\'' +
", city='" + city + '\'' +
", country='" + country + '\'' +
'}';
}
}
// 使用ImmutableAddress的ImmutablePerson
public final class ImmutablePersonWithAddress {
private final String name;
private final int age;
private final ImmutableAddress address;
public ImmutablePersonWithAddress(String name, int age, ImmutableAddress address) {
this.name = name;
this.age = age;
this.address = address; // 引用不可变对象
}
// Getter方法...
@Override
public String toString() {
return "ImmutablePersonWithAddress{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
返回不可变集合视图的例子
 

java复制代码

public final class ImmutableContainer {
private final List<String> items = new ArrayList<>();
public ImmutableContainer(List<String> initialItems) {
// 假设initialItems是安全的,并且我们想要创建一个不可变的副本
this.items.addAll(initialItems);
}
public List<String> getItems() {
// 返回不可变的列表视图
return Collections.unmodifiableList(items);
}
// 其他方法...
}

在上面的例子中,ImmutableContainer类包含了一个列表字段items,但在getItems方法中,它返回了一个不可变的列表视图,从而防止了外部类修改该列表的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql中的慢查询

Mysql慢查询的一些sql命令 慢查询的默认事件为10秒 #注意&#xff1a;慢查询一般是在调试阶段开启的&#xff0c;在开发阶段中一般不会开启&#xff0c;会对效率产生延误 #查询慢查询是否开启 show variables like %general%; #慢查询时间设置 show variables like long_query…

【运维项目经历|018】:Elasticsearch智能数据分析平台项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;本次项目周期&#xff1f; 问题2&#xff1a;服务部署架构方式及数量和配置&…

【简明指南:Python中的异常处理与稳健代码设计】

文章目录 前言异常处理基础捕获多种异常确保资源被释放使用else子句自定义异常结论 前言 软件开发过程中&#xff0c;保证代码的稳健性和可靠性至关重要。异常处理是实现这一目标的关键技术之一。在Python编程中&#xff0c;合理地捕获和处理异常不仅能提高程序的健壮性&#…

查找专利渠道

官方渠道 常规检索 (cnipa.gov.cn)https://pss-system.cponline.cnipa.gov.cn/conventionalSearch 佰腾网 佰腾网 - 查专利就上佰腾网_佰腾全球专利搜索平台_商标查询平台_企业工商信息查询平台 (baiten.cn)https://www.baiten.cn/

NLP(19)--大模型发展(3)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型训练相关知识&#xff1a; 问题&#xff1a; 数据集过大&#xff0c;快速训练模型过大&#xff0c;gpu跑不完 方案&#xff1a; 数据并行训练&#xff1a; 复制数据&#xff08;batch_size&#xff09;到多个gpu&…

簡述vue-router的動態路由

动态路由 addRoute 是 Vue Router 中的一个功能&#xff0c;它允许你在运行时动态地向路由表添加路由规则。这在一些需要基于用户行为或异步数据加载路由的场景中非常有用。以下是对 addRoute 功能的详细解释和使用示例&#xff1a; 1. 动态路由的概念 动态路由是指在应用运行…

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子&#xff08;以《天谕》为例&#xff09;2.1 下载微星 afterburner 软件 查看游戏内信息&#xff08;可跳过&#xff09;2.2 查看D3D9 帧数2.3 关闭游戏&#xff0c;替换 dll 文件2…

精品PPT | MES设计与实践,业务+架构+实施(免费下载))

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 MES设计与实践 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#x…

linux的chmod的数字太难记了,用u, g, o, a更简单!

u, g, o, 和 a是用来设置或查看文件或目录权限在类Unix或Linux系统中的特殊字符&#xff0c;它们分别代表文件或目录的所有者(user)、所属组(group)、其他用户(others)和所有用户(all users)。 而权限方r和w是其中的两种&#xff0c;分别代表读权限&#xff08;read&#xff0…

【探索数据结构】线性表之单链表

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

Autodl服务器中Faster-rcnn(jwyang)复现(一)

前言 在做实验时需要用到faster-rcnn做对比,本节首先完成代码复现,用的数据集是VOC2007~ 项目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 复现环境:autodl服务器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目录 一、环境配置二、编译cud…

2024年软考总结 信息系统管理师

选择题 英文题&#xff0c;我是一题也没把握&#xff0c;虽然我理解意思。 千万不要认为考死记硬背不对。目的不在于这。工程项目中有很多重要的数字&#xff0c;能记住说明你合格。 案例 几乎把答案全写在案例中了。 计算题 今年最简单。没有考成本。 只考了关键路径&a…

头歌OpenGauss数据库-I.复杂查询第8关:两门及以上课程不及格的学生

任务描述 本关任务:根据提供的表和数据,查询两门及其以上不及格课程的同学的学号(s_id)、姓名(s_name)及其平均成绩(avg_score),要求计算平均成绩后为整数。 student表数据: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男c…

安卓开发:相机水印设置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

【学习笔记】计算机组成原理(七)

指令系统 文章目录 指令系统7.1 机器指令7.1.1 指令的一般格式7.1.2 指令字长 7.2 操作数类型和操作类型7.2.1 操作数类型7.2.2 数据在存储器中的存放方式7.2.3 操作类型 7.3 寻址方式7.3.1 指令寻址7.3.1.1 顺序寻址7.3.1.2 跳跃寻址 7.3.2 数据寻址7.3.2.1 立即寻址7.3.2.2 直…

第四十五天 | 322.零钱兑换

题目&#xff1a;322.零钱兑换 尝试解答&#xff1a; 1.确定dp[j]含义&#xff1a;装满容量为j的背包所需要放的硬币个数为dp[j]; 2.动态转移方程&#xff1a;dp[j] dp[j - coins[i]] 1; 3.遍历顺序&#xff1a;本题应该为组合类题目&#xff0c;不考虑装入的顺序&#x…

精品PPT | 精益生产管理中MES系统的实现与应用(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 MES系统的实现与应用 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&…

吃掉 N 个橘子的最少天数(Lc1553)——记忆化搜索

厨房里总共有 n 个橘子&#xff0c;你决定每一天选择如下方式之一吃这些橘子&#xff1a; 吃掉一个橘子。如果剩余橘子数 n 能被 2 整除&#xff0c;那么你可以吃掉 n/2 个橘子。如果剩余橘子数 n 能被 3 整除&#xff0c;那么你可以吃掉 2*(n/3) 个橘子。 每天你只能从以上 …

Redis - 缓存场景

学习资料 学习的黑马程序员哔站项目黑马点评&#xff0c;用作记录和探究原理。 Redis缓存 缓存 &#xff1a;就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;读写性能较高 缓存常见的场景: 数据库查询加速&#xff1a;通过将频繁查询的数据缓存起来&…

【挖金子game】

如果您想要编写一个简单的“挖金子”游戏代码&#xff0c;可以使用Python这样的编程语言来实现。以下是一个简单的Python代码示例&#xff0c;用于创建一个基本的“挖金子”游戏&#xff1a; import random # 游戏设置 max_gold 10 # 最大金子数量 max_digs 5 # 最大挖掘…