如何使非原始类成员不可变

时间:2014-06-19 16:25:32

标签: java immutability

我在这里有一个小问题,请告诉我是否认为这是对的。

虽然使类不可变,但我有一个非原始成员。我如何使该成员成为不可变的。虽然在它自己的实现中它不是不可变的,例如

public Class A{
private final int  immutableInt;
private final String immutableString;
private final Employee toBeMadeImmutable

// individual getters

}

如果使用“toBeMadeImmutable”的getter,我将得到它的对象,我可以对该对象做任何事情,因此它是可变的,这不是必需的。

如何为非原始成员实现不变性

3 个答案:

答案 0 :(得分:2)

Java并不提供对不变性的内置支持。

您可以通过制作setters private字段并仅显示其getters as public方法来使字段不可变。

此外,通过将变量声明为final来无法实现不变性。 通过将变量声明为final,您指定不会更改引用所指向的对象。您仍然可以更改引用所指向的对象的状态(通过更改其字段)。

答案 1 :(得分:1)

如果你的某个字段不是不可变的,那么很难使你的对象变得不可变。如果你制作防御性副本,可以接近:

Employee getEmployee() {
    return new Employee(toBeMadeImmutable);
}

构造函数创建具有相同值的新Employee。

答案 2 :(得分:1)

在这种情况下你可以做的是提供toBeMadeImmutable的克隆,这样就没有人可以修改原来的Employee