2012-04-11 104 views
3

我有一個名爲RawReader的類,它讀取某些資源的字節,解析它們,然後將文件寫入輸出目錄。關於允許許多不同類型構造函數的最佳實踐?

允許將不同類型作爲源和目標傳遞給構造函數是有意義的。

  • 來源:字符串(文件或URL),URL,文件或InputStream的
  • 目的地:字符串(目錄)或文件

但是如果我重載,給我留下了8種不同的構造版本。如果我想添加第三個可選參數,例如chunkSize我會有16個構造函數!

另一方面,我可以只有兩個構造函數接受(Object, Object)(Object, Object, int)。如果參數類型不正確,則可以檢測到參數類型並引發IllegalArgumentException。

這種情況在Java中通常如何處理?

+0

這就是爲什麼我經常認爲構造函數是邪惡的 - 它們像兔子一樣繁殖! – ControlAltDel 2012-04-11 20:06:34

回答

3

您可以使用builder

Foo foo = new FooBuilder().setFile(..).setChunkSize().build(); 

.build()調用的Foo一個構造函數取變量的設置與建設者和受讓人。類似的東西:

公共類Foo {

private Foo(FooBuilder builder) { 
    //get whatever you can find from the builder to fill the state of Foo 
} 
public static FooBuilder { 
    private String filename; 
    private File file; 
    private InputStream stream; 
    private int chunkSize; 
    // getters and setters 
    public Foo build() { 
     return new Foo(this); 
    } 
} 

}

+0

感謝您的回答! :)閱讀後,我環顧四周,發現[維基百科上的示例](http://en.wikipedia.org/wiki/Builder_pattern#Java),它在構建器中創建一個新對象,而不是返回該對象而不是傳遞本身到構造函數。是否有理由相對於另一方偏好? – Annan 2012-04-11 20:43:40

+0

無所謂,這是我猜想的首選問題 – Bozho 2012-04-11 20:47:51

0

所有的想法首先與(Object, Object, int)是可怕的,不走那條路!您放棄了強大的輸入,IDE幫助和API清晰度。

在你的地方,我會限制構造函數最明顯的/低電平輸入你可以採取並提供製造商/工廠方法:

RawReader reader = RawReaderBuilder. 
    withInput(inputStream). 
    withOutput(someFile). 
    withChunkSize(). 
    build(); 
0

如果你發現你有相同簽名的構造函數,你可以使用工廠方法以不同的名稱:

public class Foo { 

    public static Foo createForDir(String dir) { 
     // create a Foo as you like and return it 
    } 

    public static Foo createForUrl(String url) { 
     // create a Foo as you like and return it 
    } 
} 
0

這是有道理的,允許不同類型的源 和目標,以構造傳遞英寸

達到一定程度。然而,提供調用者可以輕易提供的轉換沒有多大意義,特別是如果它將導致多達八個構造函數。所以:

(a)您不需要StringFile。決定一個,堅持下去。我會用File。這已經把施工人員的數量除以了4。(b)儘管存在先例,但您並不需要URLInputStream。擺脫'URL'會將數字除以2。

相關問題