繁体   English   中英

在不抛出Java中的CloneNotSupportedException异常的情况下创建克隆函数

[英]Making a clone function without throwing CloneNotSupportedException exception in Java

作为我们作业的一部分,我们被要求用clone方法实现一个抽象类。 该函数的框架给出:

/**
 * @effects Creates and returns a copy of this.
 */
public Object clone() {
    // TODO: Implement this method


}

Shape类有两个字段:

private Point location;
private Color color;

在说明中,我们被告知该方法不会抛出CloneNotSupportedException异常,并且还会询问它为什么会这样。 在我们在互联网上看到的所有示例中,clone方法都会抛出CloneNotSupportedException

您能否指出我们为什么这个克隆方法不应抛出该异常的原因。

我们编写的方法是:

/**
 * @effects Creates and returns a copy of this.
 */

public Object clone() {
    Shape new_shape = (Shape)super.clone();
    new_shape.setColor(this.getColor());
    new_shape.location = (Point)location.clone();
    return new_shape;


}

它给我们一个错误的(Shape)super.clone()部分,说:

Unhandled exception type CloneNotSupportedException ,我们应该如何创建克隆方法?

您的类应该实现Clonable接口。

您也可以使用Covariant返回类型返回Shape / Point而不是Object。 这有助于您避免不必要的类型转换。

未处理的异常类型CloneNotSupportedException

那是因为Objectclone()方法被定义为抛出CloneNotSupportedException

protected Object clone() throws CloneNotSupportedException

请参阅API doc: Object#clone()

要解决这个问题,您需要使用try/catch块来处理它,或者通过添加throws子句来重新定义它。

更新:

在说明中,我们被告知该方法不会抛出CloneNotSupportedException异常,并且还会询问它为什么会这样。

IMO -

  1. 您正在覆盖超类中的方法。 只有返回类型,方法名称和参数类型才被视为方法签名。 因此,在覆盖方法时,即使超类中的方法具有它,也可以省略子类中的throws子句。
  2. 每当你的类实现Cloneable接口时,它告诉Object类可以克隆它。 在这种情况下, clone方法的正确实现应该调用super.clone方法。 现在,您可以看到它实际上是Object类中实际生成副本的clone方法。 因此,我们应该留下Object.clone()来抛出CloneNotSupportedException 如果层次结构中的任何类未实现Cloneable接口,它将执行此操作。

我希望这是有道理的。

即使它有点大,如果你想更多地阅读它。 它在Effective Java有所解释。

其他实现抛出CloneNotSupportedException的原因是它是Object的现有clone()方法的一部分 仅仅因为定义一个方法来抛出异常并不意味着它必须这样做。 在Shape及其派生类上实现clone()方法时,不要抛出异常。

(Shape)super.clone()抛出异常的原因是这是默认行为。 在Shape上实现clone()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM