定义不可变对象的策略---粗略翻译自文档

简介: 定义不可变对象的策略---粗略翻译自文档

定义不可变对象的策略


一、原文截图
image.png

二以下是翻译
以下规则定义了用于创建不可变对象的简单策略。并非所有记录为“不可变”的类都遵循这些规则。这并不一定意味着这些类的创建者是草率的——他们可能有充分的理由相信他们的类的实例在构建后永远不会改变。但是,此类策略需要复杂的分析,不适合初学者。

1.不要提供“setter”方法,即修改字段或字段引用的对象的方法。
使所有字段最终且私有。
2.不允许子类重写方法。执行此操作的最简单方法是将类声明为 final。更复杂的方法是使构造函数私有并在工厂方法中构造实例。
3如果实例字段包含对可变对象的引用,则不允许更改这些对象:
(1)不要提供修改可变对象的方法。
(2)不要共享对可变对象的引用。从不存储对传递给构造函数的外部可变对象的引用;如有必要,请创建副本,并存储对副本的引用。同样,必要时创建内部可变对象的副本,以避免在方法中返回原始对象。

此截图摘自:
https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

相关文章
|
1月前
|
开发者 C++
经典面试题:预处理器标识#error的目的是什么
在 C 和 C++ 中,预处理器指令 `#error` 用于在编译时生成错误并终止编译。它主要用于条件编译中的错误检查,如检测缺失的宏定义或不支持的平台;指示已知问题或未实现的功能;防止错误的构建配置;以及生成编译时的显式错误信息以帮助代码维护。通过 `#error`,开发者可以在编译阶段就阻止有问题的代码继续执行,并提供明确的错误信息,从而简化调试过程。
|
3月前
|
SQL 开发者
访问者模式问题之FunctionExtractor是怎么工作的,以从SqlNode中提取函数名称的
访问者模式问题之FunctionExtractor是怎么工作的,以从SqlNode中提取函数名称的
|
3月前
|
前端开发 开发者 数据格式
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
|
NoSQL Java 数据库
解释afterPropertiesSet方法的用处
解释afterPropertiesSet方法的用处
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
|
编译器 Scala 开发者
类型匹配的注意事项和细节 | 学习笔记
快速学习类型匹配的注意事项和细节
第三章--第三节(补充):列表排序
第三章--第三节(补充):列表排序
113 0
定义一个有用的 MyBaseException
import java.util.ArrayList; import java.util.List; public class MyBaseException extends Exception { public MyBaseExceptio...
853 0