2012-06-06 72 views
1

假設控制,我需要如下創建一個對象,並設置一些值當對象被創建

FileMetaData fileMeta = fileContainer.getMetaData(); 

    fileMeta.setFileName("file name"); 
    fileMeta.setServer("my box"); 
    fileMeta.setDirectory("/path/to/dir"); 
    fileMeta.setFileType(FileType.PROPERTIES); 

後,我打算用這個對象引用做一些有用的東西。

我想承認的事實,這是可能的系統的用戶無法設置某些字段,例如,人們可以忘記

fileMeta.setDateModified(12345); 

是它在某種程度上能夠保證所有(或某些特定的)字段在使對象可用之前設置?

+0

通過「使對象可用」,你的意思是什麼? – NPE

+0

對象是單身嗎?如果是這樣 - 單身模式的變體可以產生一個優雅的解決方案。 – amit

回答

2

中沒有任何語言來執行本(除具有孤可見構造函數所需的所有參數),但你可以做到這一點慣用,對建造者模式的變化和一些方法鏈接:

FileMetaData fileMeta = new FileMetaDataBuilder(fileContainer.getMetaData()) 
    .setFileName("file name") 
    .setServer("my box") 
    .setDirectory("/path/to/dir") 
    .setFileType(FileType.PROPERTIES) 
    .build(); 

build()方法可以確保在調用具有所有必需參數的FileMetaData的相應構造函數之前設置所有必填字段。

1

使用構建器模式並將引用傳遞給構建器。當你完成在頂部添加附加功能時,調用.build並捕獲返回的FileMetaData實例。

您可以通過在設置所有先決條件之前不允許構建成功來限制它。

+0

[Builder pattern description](http://www.oodesign.com/builder-pattern.html) –

+0

我喜歡這個。謝謝! – JAM

0

基本上我可以分類以下3種方法。

首先是基於類本身。您可以將方法isReady()添加到您的班級。此方法將執行所有檢查並返回true或false。

其他方法是使用Factory或Builder模式並可能使用對象存儲庫。工廠和生成器都保證能夠在就緒狀態下創建對象。存儲庫可以用來在那裏「發佈」現成的對象,所以其他代碼只需要請求對象並以準備狀態接收它們。

其他方法是使用Wrapper(裝飾器)模式。

interface Foo { 
    public void foo(); //business method 
} 

class FooImpl implements Foo { 
    public void foo(){} // does the work 
} 


class FooDecorator implmeents Foo { 
    Foo foo; 
    public void foo(){ 
     if (isInitialized()) { 
      foo.foo(); 
     } 
     throw IllegalStateException("Not initialized"); 
    } 
} 

該解決方案可以使用動態代理或使用AOP框架來實現。