2010-07-01 74 views
0

假設你有一個API,它是無法訪問的改變:Java的裝飾簡單的方法

List<LegacyObject> getImportantThingFromDatabase(Criteria c); 

成像遺留對象有一噸的領域,你想擴展它,使獲得的某些信息更容易:

class ImprovedLegacyObject extends LegacyObject { 
    String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() { 
     //cool code that makes things easier goes here 
    } 
} 

但是,你不能只投放至ImprovedLegacyObject,即使場都是一樣的,你沒有改變任何底層代碼,你只添加到它使代碼,使用LegacyObject仍然有效,但新代碼更易於編寫。

是否有可能有一些簡單的方法來將LegacyObject轉換爲ImprovedLegacyObject而不重新創建所有的字段或訪問器?它也應該是一個快速操作,我知道你可以通過使用反射來複制所有屬性來執行某些操作,但是我認爲這樣做對於羣衆來說不會那麼快。編輯:有什麼是你的可以用靜態方法嗎?裝飾一個現有的對象?

回答

1

你將不得不自己進行復制。您可以有一個,它這種(被稱爲拷貝構造函數)構造函數:

public ImprovedLegacyObject(LegacyObject legacyObject) {   
    ... 
    //copy stuff over 

    this.someField = legacyObject.getSomeField(); 
    this.anotherField = legacyObject.getAnotherField(); 
    ... 
} 

,或者你可以有如果你在擴展該計劃,返回一個ImprovedLegacyObject

public static ImprovedLegacyObject create(LegacyObject legacyObject) { 
    ... 
    //copy stuff over 
    ... 
    return improvedLegacyObject; 
} 

靜態工廠方法行爲等遺留物,那麼你應該創建一個接口

public interface CoolNewCodeInterface { 

    public String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() { 

    } 

    public String getSomeFieldInAReallyCoolWay() { 

    } 
} 

然後你ImprovedLegacyObject是這樣的:

public ImprovedLegacyObject extends LegacyObject implements CoolNewCodeInterface { 

    //implement methods from interface 
} 
+1

是的,我想這可能是我做這件事的唯一方法:o。我試圖通過懶惰來避免這種情況......但是,Java有一種很酷的方式來做到這一點,而無需創建額外的對象並對所有屬性執行寫操作。如果沒有人想出更好的東西,我會接受 – walnutmon 2010-07-01 17:39:20

1

如何爲以Legacy Object爲參數的Improved Legacy Object製作複製構造函數。然後從舊的創建新的對象。

+0

複製構造函數將手動分配舊對象的每個屬性到新的?你能添加一個psuedo的小小snippit嗎? – walnutmon 2010-07-01 17:36:51