在不可变对象Java中限制可变对象 [英] Restrict mutable object inside immutable object Java

查看:51
本文介绍了在不可变对象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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆