可克隆接口有什么意义?

时间:2015-03-30 04:56:20

标签: java interface

Java中可克隆接口的重点是什么? java中的核心对象有一个clone()方法。你能不能只重写那个方法?:

@Override
public Foo clone(){
    return new Foo(this.x, this.y);
}

请解释您使用界面的原因。我已经知道了克隆对象的细节。我只是不明白你为什么要使用界面。

2 个答案:

答案 0 :(得分:6)

要回答您的第一个问题,您必须为Clonable方法实现clone()接口,因为对象的克隆检查接口是否已实现,否则会引发异常。< / p>

使用clone()是一个坏主意。这是Java中最初没有成功的想法之一。有一些设计问题,包括它通常是浅拷贝。如果要制作对象的副本或深层副本,最好在不使用克隆的情况下创建复制构造函数或复制方法。正确使用clone()很难。

如果您真的要使用clone(),请阅读this blog post,其中介绍了如何使用clone()。使用clone()时,基本上要记住5点:

1)克隆方法用于在Java中创建对象的副本。为了使用clone()方法,类必须实现java.lang.Cloneable接口并从java.lang.Object中覆盖protected clone()方法。如果该类没有实现Cloneable接口,则调用clone()方法将导致CloneNotSupportedException。

2)在Java中克隆Object时没有调用构造函数。

3)Java中clone()方法的默认实现提供了&#34;浅拷贝&#34;对象,因为它通过创建新实例然后通过赋值复制内容来创建Object的副本,这意味着如果您的类包含可变字段,则原始对象和克隆都将引用相同的内部对象。这可能很危险,因为对该可变字段所做的任何更改都将反映在原始对象和复制对象中。为了避免这种情况,请覆盖clone()方法以提供对象的深层副本。

4)按照惯例,应该通过调用super.clone()方法获得实例的克隆,这将有助于保留clone()方法创建的对象的不变量,即clone!= original和clone.getClass()= = original.getClass()。虽然这些并不是Javadoc中提到的绝对要求。

5)实例的浅拷贝很好,直到它只包含原语和Immutable对象,否则,你需要修改super.clone返回的一个或多个对象的可变字段,然后再将它返回给调用者。

答案 1 :(得分:1)

Java Docs中所述:

A class implements the Cloneable interface to indicate 
to the Object.clone() method that it is legal for that method 
to make a field-for-field copy of instances of that class.

具体做法是:

Invoking Object's clone method on an instance that does not 
implement the Cloneable interface results in the exception
CloneNotSupportedException being thrown.

如果您有任何疑问,请与我们联系。