簡體   English   中英

讓我的班級實現Cloneable有什么意義?

[英]What is the point in letting my class implement Cloneable?

我遇到了一些實現Clonable類代碼,文檔說明:

類實現了Cloneable接口,以向Object.clone()方法指示該方法合法地為該類的實例制作字段的字段副本。 在未實現Cloneable接口的實例上調用Object的clone方法會導致拋出異常CloneNotSupportedException。 按照慣例,實現此接口的類應使用公共方法覆蓋Object.clone(受保護)。 有關重寫此方法的詳細信息,請參閱Object.clone()。 請注意,此接口不包含克隆方法。 因此,僅僅通過實現該接口的事實來克隆對象是不可能的。 即使反射調用clone方法,也無法保證它會成功。

我無法理解實現這個類的重點,正如在文檔中所說的那樣.clone方法沒有在接口中實現,我必須實現它。 那么為什么要使用這門課? 為什么我copyClass我的類中編寫一個方法copyClass來制作對象副本而不執行這個類?

要實現克隆方法,您只需執行以下操作:

public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

您當然可以根據需要自定義方法以制作更深層的副本。

調用super.clone()幾乎是強制性的,因為除非該類是final並且因此無法重寫,否則clone()方法必須返回與調用它的對象相同的類的實例。 因此,簡單地創建新實例並復制狀態將適用於此類,但不適用於所有子類。 此外,您並不總是可以訪問超類中包含的所有狀態。

簡而言之,您將Object的受保護克隆方法設為public。 Object.clone()方法所做的第一件事就是(這不是真正的代碼,但這就是方法的作用):

if (!(this instanceof Cloneable)) {
    throw new CloneNotSupportedException();
}

因此, Cloneable只是一個標記接口,讓Object.clone()方法知道它在調用時不能拋出異常。

這是Java中設計最糟糕的部分之一。 通常,您應該更喜歡使用復制構造函數而不是使用clone()

它允許您編寫更通用的代碼。 如果你有多個實現Cloneable接口的類,並希望將它們的實例作為參數傳遞給方法,則不必創建多個方法,只需使用一個變量類型,就可以使用Cloneable t 它與其他接口相同。 並且,與其他所有接口相同,它有點多重繼承。 實現這些接口也使您的代碼更加清晰。

除了其他人所說的,在實現原型設計模式時經常使用Cloneable。

暫無
暫無

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

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