Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-按照this.UUID=original.getUUID()对UUID字段进行深度复制是否安全?_Java_Uuid_Deep Copy - Fatal编程技术网

Java-按照this.UUID=original.getUUID()对UUID字段进行深度复制是否安全?

Java-按照this.UUID=original.getUUID()对UUID字段进行深度复制是否安全?,java,uuid,deep-copy,Java,Uuid,Deep Copy,对于下面的类,当我进行深度复制时,按如下方式编写代码是否安全 this.id = original.getId(); 在我的测试中,它看起来还可以,因为当我想要更新UUID字段时,我总是给它分配一个新的UUID实例(我找不到任何可以修改现有UUID实例的函数)。在这种情况下,这个复制的实例将永远不会对原始实例产生副作用 public class Container { private Type type; private UUID id; private Contai

对于下面的类,当我进行深度复制时,按如下方式编写代码是否安全

this.id = original.getId();
在我的测试中,它看起来还可以,因为当我想要更新UUID字段时,我总是给它分配一个新的UUID实例(我找不到任何可以修改现有UUID实例的函数)。在这种情况下,这个复制的实例将永远不会对原始实例产生副作用

public class Container {

    private Type type;
    private UUID id;
    private Container c;

    // public constructors here

    protected Container(Container original, boolean deepCopy) {
        this.type = original.getType();
        this.id = original.getId();
        // for deep copy of id field, should I write as:
        // this.id = new UUID(original.getId().getMostSignificantBits(), original.getId().getLeastSignificantBits());
        if (original.getC() != null) {
            this.c = deepCopy ? original.getC().deepCopy() : original.getC();
        }
    }

    // getter and setter here

    public Container deepCopy() {
        return new Container(this, true);
    }

}
但是,在我现在维护的项目中(不是由我创建的),我发现深度复制代码如下所示:

this.id = new UUID(original.getId().getMostSignificantBits(), original.getId().getLeastSignificantBits());
毫无疑问,这是一个正确的解决方案

我的问题是:这样做安全吗

this.id = original.getId();
也许这是一个愚蠢的问题,谢谢你花时间来帮助我。

深度复制意味着对象树中的每个对象都是一个新实例。通过执行

this.id = original.getId();
您正在使用与原始对象相同的UUID对象

找到的代码是如何复制UUID对象,使其具有相同的值。为安全起见,不需要复制UUID,因为UUID类是;从其:

表示不可变的通用唯一标识符(UUID)的类


但是,可能还有其他支持复制的注意事项。

是的,这是安全的。UUID是不可变的

正如您所观察到的,您从不修改实例,只需将新实例分配给您的成员。因此,您永远不会影响任何其他代码的UUID,即使它们最初引用了与您相同的UUID


“复制”代码完全没有必要。

谢谢@greybearedgeek,你的答案非常有用。=)♦, 是的,你说得对。我在“作弊”,没有遵守深度复制的规则。在某些情况下,这可能会带来麻烦。非常感谢你。