作为我们作业的一部分,我们被要求使用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
,我们应该如何创建克隆方法?
答案 0 :(得分:7)
您的班级应该实施Clonable界面。
此外,您可以使用Covariant Return Types来返回Shape / Point而不是Object。这有助于您避免不必要的类型转换。
答案 1 :(得分:7)
未处理的异常类型CloneNotSupportedException
这是因为clone()
中的Object
方法被定义为抛出CloneNotSupportedException
:
protected Object clone() throws CloneNotSupportedException
请参阅API文档:Object#clone()
要解决这个问题,您需要使用try/catch
块来处理它,或者通过添加throws
子句重新定义它。
<强>更新强>
根据说明,我们被告知该方法不会抛出CloneNotSupportedException异常,并且还会询问它为什么会这样。
IMO -
Cloneable
接口时,它就告诉Object
类可以克隆它。在这种情况下,clone
方法的正确实现应该调用super.clone
方法。现在,您可以看到它实际上是clone
类中实际生成副本的Object
方法。所以,我们应该留下Object.clone()
来抛出CloneNotSupportedException
。如果层次结构中的任何类没有实现Cloneable
接口,它就会这样做。我希望这是有道理的。
即使它有点大,如果你想更多地阅读它。它在Effective Java - Item 10: Override clone judiciously中解释。
答案 2 :(得分:2)
其他实现抛出CloneNotSupportedException的原因是它是现有clone() method of Object的一部分。仅仅因为定义一个方法来抛出异常并不意味着它必须这样做。在Shape及其派生类上实现clone()方法时,不要抛出异常。
(Shape)super.clone()
抛出异常的原因是这是默认行为。在Shape上实现clone()。