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

Creating Immutable class in Java with mutable reference

提问人:sid 提问时间:3/21/2016 最后编辑:sid 更新时间:3/21/2016 访问量:821

问:

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

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

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

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

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

爪哇岛 参考 不变性 可变

评论

2赞 SomeJavaGuy 3/21/2016
看看 .您不能直接修改它,对 a 的实例所做的任何更改都会返回 a 的新实例。您无法仅通过调用其方法来修改该实例。StringStringStringString

答:

2赞 TheLostMind 3/21/2016 #1

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

如果未提供 getter,并且此实例未从外部源传递给类(通常传递给构造函数),则只有您的类才能访问此组合实例。

永远不要存储对传递给 构造 函数

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

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

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