簡體   English   中英

可克隆接口有什么意義?

[英]What is the point of the cloneable interface?

Java中的可克隆接口有什么意義? java中的核心對象有一個clone()方法。 你能不能覆蓋那個方法?:

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

請解釋為什么要使用該界面。 我已經知道了克隆對象的細節。 我只是不明白你為什么要使用這個界面。

要回答第一個問題,必須實現Clonable接口以使clone()方法起作用,因為Object的clone會檢查接口是否已實現,否則會引發異常。

使用clone()是個壞主意。 這是Java中最初沒有成功的想法之一。 有一些設計問題,包括它通常是淺拷貝。 如果要制作對象的副本或深層副本,最好創建復制構造函數或復制方法,而不使用克隆。 正確使用clone()很難。

如果你真的想要使用clone() ,那么請閱讀這篇博文 ,其中介紹了如何使用clone() 使用clone()時基本上要記住5點:

1)克隆方法用於在Java中創建對象的副本。 為了使用clone()方法,類必須實現java.lang.Cloneable接口並從java.lang.Object中覆蓋protected clone()方法。 如果該類沒有實現Cloneable接口,則調用clone()方法將導致CloneNotSupportedException。

2)在Java中克隆Object時沒有調用構造函數。

3)Java中clone()方法的默認實現提供了對象的“淺拷貝”,因為它通過創建新實例然后通過賦值復制內容來創建Object的副本,這意味着如果你的Class包含一個可變字段,那么兩個原始對象和clone將引用相同的內部對象。 這可能很危險,因為對該可變字段所做的任何更改都將反映在原始對象和復制對象中。 為了避免這種情況,重寫clone()方法以提供對象的深層副本。

4)按照慣例,應該通過調用super.clone()方法獲得實例的克隆,這將有助於保留clone()方法創建的對象的不變量,即clone!= original和clone.getClass()== original。的getClass()。 雖然這些並不是Javadoc中提到的絕對要求。

5)實例的淺拷貝很好,直到它只包含原語和Immutable對象,否則,你需要修改super.clone返回的一個或多個對象的可變字段,然后再將它返回給調用者。

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.

請讓我知道,如果你有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM