Java學習筆記 謹慎地覆蓋clone

2021-08-26 19:49:17 字數 1192 閱讀 4143

1、clone方法的通用約定是非常弱的

x.clone()!=x

x.clone().getclass()==x.getclass()

x.clone().equals(x)

都不是絕對的要求

2、clone方法就是另乙個構造器,你必須保證它不會傷害到原始的物件,並確保正確地建立被轉殖物件中的約束條件。

3、clone架構與應用可變物件的final域的正常用法是不相容的。

4、深度clone,典型例子hashtable

5、執行緒安全的類實現cloneable介面,clone方法必須實現好同步:hashtable。

public class deepclone } 總結:

(1)預設實現方式

實現了cloneable介面的類都應該有乙個公用的方法覆蓋clone:

@override public phonenumber clone()

此公有方法首先呼叫super.clone(),然後修正任何需要修正的域(淺轉殖、深度轉殖)。

(2)最佳實踐

實現物件的拷貝的好辦法是提供乙個拷貝構造器(copy constructor)或者拷貝工廠(copy factory)

相比cloneable/clone優點:

不依賴於某一種很有風險的,語言之外的物件建立機制;

不要求遵守尚未制定好的文件規範;

不會與final域的正常使用發生衝突;

不會丟擲不必要的受檢查異常clonenotsupportedexception;

不需要強制進行型別轉換;

建議使用最佳實踐

/** * 拷貝構造器(copy constructor)或者拷貝工廠(copy factory)展示 * @author administrator liuyang * dec 23, 2009-12:05:00 am */ public class goodclone /** * 拷貝構造器 * @param good */ public goodclone(goodclone good) /** * 拷貝工廠 * @param good * @return */ public static goodclone newinstance(goodclone good) public static goodclone cloneinstance(goodclone good) public static void main(string arr) }

Java學習筆記 11 謹慎地覆蓋clone

1 clone方法的通用約定是非常弱的 x.clone x x.clone getclass x.getclass x.clone equals x 都不是絕對的要求 2 clone方法就是另乙個構造器,你必須保證它不會傷害到原始的物件,並確保正確地建立被轉殖物件中的約束條件。3 clone架構與應...

第11條 謹慎地覆蓋clone

cloneable介面表明這樣的物件時允許轉殖的,但這個介面並沒有成功達到這個目的,主要是因為它缺少乙個clone方法,object的clone方法是受保護的。如果不借助反射,就不能僅僅因為乙個物件實現了colneable就可以釣魚clone方法,即使是反射呼叫也不能保證這個物件一定具有可訪問clo...

JAVA學習筆記 隱藏和覆蓋 續

1 屬性的隱藏 子類中宣告了與父類中相同的成員變數名,則從父類繼承的變數將被隱藏 子類擁有了兩個相同名字的變數,乙個繼承自父類,另乙個由自己宣告 當子類執行繼承自父類的操作時,處理的是繼承自父類的變數,而當子類執行它自己宣告的方法時,所操作的就是它自己宣告的變數 2 如何訪問被隱藏的父類屬性 呼叫從...