【问题标题】:Java - Is it safe to do deepCopy of UUID field as this.uuid = original.getUUID()?Java - 作为 this.uuid = original.getUUID() 对 UUID 字段进行 deepCopy 是否安全?
【发布时间】:2015-05-18 21:09:53
【问题描述】:

对于下面的类,当我做深拷贝的时候,代码写成这样安全吗

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();

也许这是一个愚蠢的问题,感谢您抽出时间来帮助我。

【问题讨论】:

    标签: java uuid deep-copy


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@GreyBeardedGeek,你的回答很有帮助。 =)
    【解决方案2】:

    “深拷贝”意味着对象树中的每个对象都是一个 实例。通过执行

    this.id = original.getId();
    

    您正在使用与原始对象相同的 UUID 对象。

    您找到的代码是您如何制作 UUID 对象的副本,使其具有相同的值。为安全起见,无需复制 UUID,因为 UUID 类为 immutable;来自其javadoc:

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

    但是,可能还有其他支持制作副本的考虑因素。

    【讨论】:

    • ♦,是的,你是对的。我在“作弊”而不遵循深拷贝的规则。在某些情况下,这可能会带来麻烦。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多