2013-10-28 114 views
4

我試圖做這樣的事情同樣的參數類型的多個構造函數的類:如何創建與使用

 
public class Arquivo { 

    private File diretorio = null ; 

    public Arquivo(File dir){ 
     this.diretorio = dir; 
    } 

    public Arquivo(String dir){ 
     this(new File(dir)); 
    } 

    public Arquivo(String fileName){ 
     this(new File("./src/Data/"+fileName)); 
    } 
} 

回答

10

你不能構造函數,即構造

的限制之一

時間開始使用static factory pattern


請參見

+0

另外,請考慮你將如何_use_ suc h一對構造函數。你期望新的Arquivo(「foo」)會做什麼?它會調用哪個構造函數? – yshavit

+0

@ysha我可以在我的工廠方法中將構建邏輯與setter一起打包,或者我將使用Builder模式 –

+0

對不起,您所在的「你」是針對OP的。 :)我得到這樣一個事實,即如果Java確實允許兩個具有相同簽名的構造函數,它會使這些構造函數的用法不明確。我爲你的答案+1了 - 工廠方法是這裏的方法。 – yshavit

3

您不能創建接收單String參數兩個構造中,只存在一個這樣的構造函數。有必須是簽名之間的區別,例如,將第二個參數添加到其中一個構造函數。

或者,你可以創建一個單一的構造,並在第二個參數是否是一個文件或目錄說明:

// isFile == true means it's a file. isFile == false means it's a directory 
public Arquivo(String fileName, boolean isFile) { 
    this(new File((isFile ? "./src/Data" : "") + fileName)); 
} 
-1

構造函數不能做到這一點

一個懶惰的解決方案將是

public Arquivo(String s) {} 

public Arquivo(String s, boolean b) {} 

而只是不使用布爾值

+0

是否有辦法做類似的事情,但是,使用最資源友好的路徑?您提供的解決方案可能更適合這種情況,否則,我將不得不在我的項目中更改一些額外的代碼。 – Hydrocat

+0

使用'魔術布爾值'可能真的很混亂。不期望這樣的編碼可能會浪費時間在不存在的代碼中搜索布爾值,並且可能會假定其中一個被刪除(意外?誰知道?)而沒有文檔。 – Pureferret

+0

像你說的'沒有文件',這是不正確的。 然後我再次說'一個懶惰的解決方案',我同意你的意見。 – mabdrabo