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

使用可变引用在Java中创建不可变类,java,class,reference,immutability,mutable,Java,Class,Reference,Immutability,Mutable,我不理解在Java中使类不可变的要求。以下是我无法理解的要求: 1) 如果实例字段包括对可变对象的引用,则不允许更改这些对象: a) 不要提供修改可变对象的方法 b) 不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。类似地,在必要时创建内部可变对象的副本,以避免在方法中返回原始对象 请用一个简单明了的例子来解释这个概念 不要提供修改可变对象的方法 如果您不提供getter,并且这个实例没有从外部源传递给您的类(通常传递给构造函数)

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

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

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

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

请用一个简单明了的例子来解释这个概念

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

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

永远不要存储对传递给服务器的外部可变对象的引用 建造师

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

必要时创建内部可变对象的副本以避免 在您的方法中返回原件

如果必须将引用类型返回给调用方,则应返回防御副本,而不是对原始实例的引用

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

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

永远不要存储对传递给服务器的外部可变对象的引用 建造师

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

必要时创建内部可变对象的副本以避免 在您的方法中返回原件


如果必须将引用类型返回给调用方,则应返回防御副本,而不是原始实例的引用。

只需查看
字符串即可。您不能直接修改它,对
字符串的实例所做的任何更改都会返回
字符串的新实例。仅通过调用
字符串上的方法无法修改该字符串的实例。只需查看
字符串
。您不能直接修改它,对
字符串的实例所做的任何更改都会返回
字符串的新实例。您不能仅通过调用
字符串的方法来修改该字符串的实例。