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 如何訪問被隱藏的父類屬性 呼叫從...