java +我应该使实例变量类不可变

时间:2013-05-19 18:58:03

标签: java immutability

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

  

不要提供“setter”方法 - 修改字段或方法的方法   字段引用的对象。       使所有字段成为最终和私有。       不允许子类重写方法。最简单的方法是将类声明为final。更复杂的方法   是使构造函数私有并在工厂中构造实例   方法。       如果实例字段包含对可变对象的引用,则不允许更改这些对象:           不要提供修改可变对象的方法。           不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如果   必要的,创建副本,并存储对副本的引用。   同样,在创建内部可变对象的副本时   必须避免在方法中返回原件。

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

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

3 个答案:

答案 0 :(得分:0)

您可以将员工的地址作为最终变量,因此必须在之前实例化 构造函数完成执行。 所以你可以修改员工的构造函数,这样它总是需要实例中的地址参数 地址变量。 一旦设置,你就不能将新地址obj分配给已经初始化的地址变量。

答案 1 :(得分:0)

名为Employee的类具有Address类型的实例变量a 我的问题:如何使这个类不可变(条件:我想从getAddress()getter返回相同的实例变量a。)

如果你想在getter中返回完全相同的变量 - 你不能在那里使用副本。但也许你应该为equals()类实现Address方法?这似乎比依赖实例平等要好得多。你可以使用副本,然后开心。

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

这是你想要它做的唯一方法。但是你仍然需要使Address不可变的文件。字符串默认是不可变的,EMUN也是如此,如果你想返回别的东西 - 那么需要使用防御性副本。

答案 2 :(得分:0)

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

如果您愿意复制存储在字段a中的实例并返回该实例,则不一定是这种情况。