Java 将类枚举传递给克隆是否安全?

Java 将类枚举传递给克隆是否安全?,java,enums,clone,pass-by-reference,pass-by-value,Java,Enums,Clone,Pass By Reference,Pass By Value,我有一个简单的类,它保存了一个更大、更大的类的骨架。所有这些框架都是一个字符串id、一个类型枚举和一些选项标志 我希望能够克隆此骨架,但我不知道枚举是否是克隆安全的(传递值)。我认为它们不是,因为它们被视为类(通过引用传递)。将枚举传递到克隆中是否安全 为清晰起见,示例: class A { String id; Enum state; int flags; A clone() { A ret = new A(); ret.id

我有一个简单的类,它保存了一个更大、更大的类的骨架。所有这些框架都是一个字符串id、一个类型枚举和一些选项标志

我希望能够克隆此骨架,但我不知道枚举是否是克隆安全的(传递值)。我认为它们不是,因为它们被视为类(通过引用传递)。将枚举传递到克隆中是否安全

为清晰起见,示例:

class A {
    String id;
    Enum state;
    int flags;

    A clone() {
        A ret = new A();
        ret.id = id;
        ret.state = state; // Am I safe here?
        ret.flags = flags;
        return ret;
    }
}

根据定义,枚举实例是单实例。根据设计,每个枚举实例只有一个实例。显然,你唯一能做的就是复制它的引用。

JB Nizet的答案是正确的。但是,为了防止您试图覆盖
Object.clone()
,请注意Java中克隆对象的官方方式如下:

class A implements Cloneable {
    String id;
    Enum state;
    int flags;

    public A clone() {
        A ret = (A) super.clone();
        ret.id = id;
        ret.state = state;  // Enum is a singleton, so this is ok
        ret.flags = flags;
        return ret;
    }
}

请注意,您必须调用
(A)super.clone()
,而不是
new A()
,并且您的类必须实现
可克隆接口。

如果您的Java伪代码试图重写
Object.clone()
,请小心:如果是这种情况,则无法正确实现!如果不破坏
clone()
的合同,您就不能创建
newa()
。如果您的方法与
Object.clone()
无关,那么最好将其重命名以避免混淆。