1

来自http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

不要提供“setter”方法——修改字段或字段引用的对象的方法。将所有字段设为最终字段和私有字段。不允许子类覆盖方法。最简单的方法是将类声明为 final。更复杂的方法是使构造函数私有并在工厂方法中构造实例。如果实例字段包含对可变对象的引用,则不允许更改这些对象:不要提供修改可变对象的方法。不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。相似地,

一个名为 Employee 的类有一个Address 类型的实例变量a
我的问题:应该怎样做才能使这个类不可变(条件:我想从 getAddress() getter返回相同的实例变量a )。
我应该使地址类不可变吗?

注意:我理解防御副本,但不想使用这个

4

3 回答 3

0

一个名为 Employee 的类有一个 Address 类型的实例变量 a 我的问题:应该怎样做才能使这个类不可变(条件:我想从 getAddress() getter 返回相同的实例变量 a )。

如果你想在 getter 中返回完全相同的变量 - 你不能在那里使用复制。但也许你应该equals()为这个类实现方法Address?这似乎比依赖实例相等要好得多。那时您可以使用副本,并且很高兴。

我应该使地址类不可变吗?

这是按照您的意愿进行操作的唯一方法。但是您仍然需要制作Address不可变的文件。默认情况下,字符串是不可变的,EMUN 也是如此,如果您想返回其他内容 - 您将需要使用防御性副本。

于 2013-05-19T19:07:01.277 回答
0

是的,如果您想返回存储在 field 中的相同实例a,您的 Address 类需要是不可变的,以使您的 Employee 类不可变。

如果您愿意复制存储在字段中的实例a并将其返回,则不必如此。

于 2013-05-19T19:07:12.997 回答
0

您可以将员工的地址作为最终变量,因此必须在构造函数完成执行之前对其进行实例化。因此您可以修改员工的构造函数,使其始终采用地址参数 n 初始化实例地址变量。一旦设置,您就无法将新地址 obj 分配给已经初始化的地址变量。

于 2013-05-19T19:03:39.823 回答