java - 在 Java 中使用可变引用创建不可变类

标签 java class reference immutability mutable

我不明白在 Java 中使类不可变的要求。以下是我无法理解的要求:

1) 如果实例字段包含对可变对象的引用,则不允许更改这些对象:

a) 不要提供修改可变对象的方法。

b) 不要共享对可变对象的引用。切勿存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。同样,必要时创建内部可变对象的副本,以避免在方法中返回原始对象。

请用一个清晰​​简单的例子解释这个概念。

最佳答案

Don't provide methods that modify the mutable objects

如果您不提供 getter,并且该实例不是从外部源传递给您的类(通常传递给构造函数),则只有您的类可以访问这个组合实例。

Never store references to external, mutable objects passed to the constructor

在 Java 中,甚至引用都是按值传递的,因此当将引用类型传递给类的构造函数时,您需要创建实例的副本(即,不要如果不使用传递的实例,请使用该实例的深层复制)。

create copies of your internal mutable objects when necessary to avoid returning the originals in your methods.

如果您必须向调用者返回引用类型,那么您应该返回防御性副本,而不是对原始实例的引用。

关于java - 在 Java 中使用可变引用创建不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36130204/

相关文章:

java - 在导出远程对象时,如何强制 RMIIO 库使用我的自定义 RMI 套接字工厂?

java - 下一个按钮不增加变量 JSP

javascript - 从 AJAX 响应程序脚本调用 PHP 类

matlab - 如何在 Matlab 中检查一个类是否有特定的基类

javascript - 从 Knockout 组件中引用 DOM 元素

C++ 独立引用 - 有什么用?

java.io.FileNotFoundException : This file can not be opened as a file descriptor; it is probably compressed

Java 多输入对话框

python - Python 中的实例变量与类变量

c# - 我在 C# 中看不到另一个命名空间的引用类