代码之家  ›  专栏  ›  技术社区  ›  Alex N.

为什么java.lang.Object中的clone()方法受到保护?

  •  122
  • Alex N.  · 技术社区  · 17 年前

    clone() java.lang.Object ?

    11 回复  |  直到 13 年前
        1
  •  108
  •   oxbow_lakes    17 年前

    克隆受到保护的事实非常可疑 clone Cloneable

    :

    if(a instanceof Cloneable) {
        copy = ((Cloneable) a).clone();
    }
    

    可克隆的 可克隆的 可克隆的 Serializable

    ISomething i = ...
    if (i instanceof Cloneable) {
       //DAMN! I Need to know about ISomethingImpl! Unless...
       copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
    }
    

    引文来源 :
    "

        2
  •  31
  •   Bill K    17 年前

    孙:

        3
  •  8
  •   Andrew Hare    17 年前

    clone

        4
  •  4
  •   Silfverstrom    17 年前

    Clone方法不能直接用于任何对象,这就是为什么它被子类覆盖的原因。

    当然,这可能是公开的,只是在克隆不可能的情况下抛出一个适当的例外,但我认为这会产生误导。

    现在实现clone的方式会让你思考为什么要使用clone,以及如何克隆你的对象。

        5
  •  3
  •   Carl Manaster    17 年前

    它受到保护,因为默认实现对所有字段(包括private)进行浅层成员复制, 规避构造函数

    出于同样的原因,默认实现 clone() Cloneable 。这是一个潜在的不安全操作,后果深远,因此该类的作者必须明确选择加入。

        6
  •  3
  •   Michaela Elschner    10 年前

    • #clone
    • Object

    子类可调用但其他类不能调用的方法的正确范围是什么?

    protected .

    Cloneable

        7
  •  2
  •   Janusz Daniel Rindt    17 年前

    来自cloneable的javadoc。

    * By convention, classes that implement this interface (cloneable) should override 
    * <tt>Object.clone</tt> (which is protected) with a public method.
    * See {@link java.lang.Object#clone()} for details on overriding this
    * method.
    
    * Note that this interface does <i>not</i> contain the <tt>clone</tt> method.
    * Therefore, it is not possible to clone an object merely by virtue of the
    * fact that it implements this interface.  Even if the clone method is invoked
    * reflectively, there is no guarantee that it will succeed.
    

        8
  •  0
  •   SARIKA    8 年前

    Clone()方法内部有一个检查“是否为Cloneable实例”。Java团队可能认为这将限制clone()方法的不当使用。clone(()方法是受保护的,即仅由子类访问。由于object是所有子类的父类,因此如果我们没有对“Cloneable实例”进行上述检查,Clone()方法实际上可以被所有类使用。这就是为什么Java团队可能会考虑通过在clone()方法中检查“它是Cloneable的实例”来限制clone的不当使用。

    因此,任何实现cloneable的类都可以使用Object类的clone()方法。

        9
  •  -1
  •   fyhao    17 年前

    但我通过实现这段代码来解决这个问题

    public class Side implements Cloneable {
        public Side clone() {
    
            Side side = null;
            try {
                side = (Side) super.clone();
            } catch (CloneNotSupportedException e) {
                System.err.println(e);
            }
            return side;
        }
    }
    

    正如之前有人所说。

        10
  •  -2
  •   Community Mohan Dere    9 年前

    好吧,sun的开发人员也只是人类,他们确实犯了一个巨大的错误,将clone方法实现为受保护的,就像他们在ArrayList中实现了一个不起作用的clone方法一样!因此,一般来说,即使是经验丰富的Java程序员对克隆方法也存在更深层次的误解。

    Bug in using Object.clone()

        11
  •  -4
  •   Fabian Schmengler    13 年前

    Java JDK框架再次展现出卓越的思维:

    Cloneable接口不包含“public T clone();”方法,因为它的行为更像是一个允许克隆它的实例的属性(例如Serializable)。

    这种设计没有任何问题,因为:

    1. Object.clone()不会对自定义类执行您想要的操作。

    2. “公共MyClass clone()”

    3. 如果你有MyInterface扩展Cloneable和一些实现MyInterface的MyClasses: