gpt4 book ai didi

java - 限制不可变对象(immutable对象)Java中的可变对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:39 25 4
gpt4 key购买 nike

我正在学习不可变对象(immutable对象)。我正在尝试这段代码

  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的name变量的值

但是下面的代码改变了这个值

 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

如何限制?

最佳答案

要使对象不可变,其所有 属性都必须不可变。它的状态不能改变。

为此,您必须在 NormalObject 上放置一个不可变外观,您不能直接返回一个 NormalObject。返回它的方法也需要不同的返回类型,您不能返回 NormalObject 但实际上会返回一些行为不像 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();
}
}

或者,如果可以接受复制对象并且它有一个复制构造函数(或者您可以添加一个),您也可以这样做,但是复制并返回很昂贵。

关于java - 限制不可变对象(immutable对象)Java中的可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com