【问题标题】:Is it clone safe to pass a classes enum to a clone?将类枚举传递给克隆是否安全?
【发布时间】:2012-02-11 20:46:27
【问题描述】:

我有一个简单的类,它包含一个更大、更笨重的类的骨架。这个骨架就是一个字符串 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;
    }
}

【问题讨论】:

  • 如果您的 Java 伪代码试图覆盖 Object.clone(),请小心:如果是这种情况,它就没有正确实现!你不能在不违反clone() 的情况下做new A()。如果您的方法与Object.clone() 无关,那么您最好将其重命名以避免混淆。

标签: java enums clone pass-by-reference pass-by-value


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多