在不可变对象Java中限制可变对象 [英] Restrict mutable object inside immutable object Java
问题描述
我正在学习不可变的对象.我正在尝试这段代码
I am learning about immutable Objects. I am trying this code
public final class ImmutableObject {
private final String name;
private final NormalObject obj = new NormalObject();
public String getName() {
return name;
}
public ImmutableObject(String name) {
this.name = name;
obj.setName(name);
}
public NormalObject getObj() {
NormalObject tempObj = obj;
return tempObj;
}
}
public class NormalObject {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我想限制调用类更改NormalObject的名称变量的值
I want to restrict the calling class from changing the value of name variable of NormalObject
但是以下代码更改了值
ImmutableObject obj = new ImmutableObject("Siddle");
System.out.println(obj.getObj().getName()); //prints Siddle
obj.getObj().setName("Kelly");
System.out.println(obj.getObj().getName()); //prints Kelly
如何限制它?
推荐答案
要使对象不可变,所有的属性必须不可变.其状态不得更改.
For an object to be immutable, all of its properties must be immutable. Its state must not be changeable.
为此,您必须在NormalObject
上放置一个不变的外观,您不能直接返回NormalObject
.返回它的方法还需要其他返回类型,您不能返回NormalObject
,但实际上返回的行为不像NormalObject
.
To do that, you have to put an immutable facade on NormalObject
, you can't directly return a NormalObject
. The method that returns it will also need a different return type, you can't return NormalObject
but actually return something that doesn't behave like a NormalObject
.
例如:
public final class ImmutableObject {
private final String name;
private final NormalObject obj = new NormalObject();
private final ImmutableNormalObject objFacade = new ImmutableNormalObject(obj);
public String getName() {
return name;
}
public ImmutableObject(String name) {
this.name = name;
obj.setName(name);
}
public ImmutableNormalObject getObj() {
return objFacade;
}
}
public class NormalObject {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ImmutableNormalObject {
private NormalObject obj;
public ImmutableNormalObject(Normalobject o) {
this.obj = o;
}
public String getName() {
return obj.getName();
}
}
或者,如果可以复制对象并且它具有一个复制构造函数(或者可以添加一个),则可以这样做,但是复制并返回很昂贵.
Alternately, if it's acceptable to copy the object and it has a copy constructor (or you can add one), you could do that, but copy-and-return is expensive.
这篇关于在不可变对象Java中限制可变对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!