2012-01-17 90 views
4

我有一个简单的类,为更大,更庞大的类保存骨架。所有这些框架都是一个字符串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; 
    } 
} 
+0

如果你的Java伪代码试图重写'Object.clone()',那么要小心:如果是这种情况,它没有正确实现!你不能在不破坏clone()的合约的情况下执行新的A()。如果你的方法与'Object.clone()'无关,那么你最好重命名它以避免混淆。 – 2012-01-17 01:15:08

回答

11

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

4

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(),你的类必须实现Cloneable接口。