創建一個這樣的接口有什麼不好或錯誤,並在我需要確保一個變量是可複製的地方使用它嗎?Java公共克隆界面
public interface PublicCloneable<I> {
public I clone();
}
的是一個事實,SO相關的問題是爪哇Cloneable接口壞了,我不明白爲什麼它沒有這樣的實現。
創建一個這樣的接口有什麼不好或錯誤,並在我需要確保一個變量是可複製的地方使用它嗎?Java公共克隆界面
public interface PublicCloneable<I> {
public I clone();
}
的是一個事實,SO相關的問題是爪哇Cloneable接口壞了,我不明白爲什麼它沒有這樣的實現。
您可以。創建新接口的主要問題是,您只能在您創建的新類上使用此接口,並明確實現此接口。 Java庫中的現有類無法實現此接口,因爲您無法更改其代碼。 (該接口不會奇蹟般地應用於現有的類型。)所以它只有在您爲所有期望使用的對象創建一個自定義類族時纔有用,並且不要使用標準庫類。
這很好,但您必須在方法內提供您自己的克隆邏輯。
java.lang.Cloneable
的想法是將一個類標記爲可克隆的,並將克隆邏輯標記爲由JVM處理。您不提供使用Object.clone()
的逐場克隆您可以從this answer中提出的克隆機制中選擇另一種克隆機制(或使用與另一個克隆機制的組合)。
如果你想完全用你自己的clone()
實現它應該沒問題。但是,如果你想在某個時候使用Object.clone(),我建議
public interface PublicCloneable<I> extends Cloneable {
public I clone();
}
和內實現:
public static class MyClass implements PublicCloneable<MyClass> {
public MyClass clone() {
try {
return (MyClass)super.clone(); // Or do whatever you need here
} catch (CloneNotSupportedException e) {
// Always supported
}
}
我不知道,如果它編譯,但我想和它似乎沒問題。
當然,里程可能會有所不同。
我在poo課程中學到的方法是使用複製構造函數執行克隆..所以它始終是{return new MyClass(this)}。我從來沒有使用過Object.clone(),我甚至都沒有意識到它是有用的(它是否會自動執行深層複製?)。無論如何,我只需要接口,因爲我創建了一個泛型類,其中類型參數必須實現方法克隆,所以我確保我可以使用它。用戶需要在其課程中提供正確的克隆方法。 – jmacedo
Eurgh。 'java.lang.Cloneable'關於實現而非接口。不要將它與實際的接口類型混淆。 –
@Tom您有權發表您的意見,但您對當前表單的評論沒有多大意義。 –
準備提及深層克隆。你在那裏發佈的好主題。 –
請檢查我對Alex Gitelman的回答的評論 – jmacedo