2012-03-05 62 views
4

考慮一個從CSV行中找到的數據實例化的類,並存儲它的一些字段。爲這個類創建兩個構造函數是有意義的 - 從原始CSV行創建一個構造函數,另一個使用顯式變量賦值。Java:重載相互呼叫的構造函數

例如,

public MyClass(String csvLine) 
{ 
    String[] fields = StringUtils.split(csvLine, ','); 
    this(fields[3], fields[15], Integer.parseInt([fields[8])); 
} 

public MyClass(String name, String address, Integer age) 
{ 
    this.name=name; 
    this.address=address; 
    this.age=age; 
} 

在Java中,失敗的原因是:

構造函數調用必須是第一條語句在 構造WhereOnEarth.java

什麼是正確的方法實施這個?

回答

5

我不會混表示解析的內容和內容解析類的類。我會創建一個MayClassFactory或沿着這些線:

public class MyClassFactory { 

    public MyClass fromCsvLine(String csvLine) { 
     String[] fields = StringUtils.split(csvLine, ','); 
     return new MyClass(fields[3], fields[15], Integer.parseInt([fields[8])); 
    } 

    //... 
} 
+0

+1這也是「Effective Java」推薦的。謝謝! – 2012-03-05 12:55:33

+0

+1這也可以是'MyClass'中的靜態工廠方法,例如, 'MyClass.parse(String csv)'(如果你不介意_little_混合!) – DNA 2012-03-05 12:58:02

+0

@DNA:是的,請參閱我的答案。雖然如果解析稍微複雜一點(或者有多個源,例如XML),那麼強烈建議解耦。 – 2012-03-05 13:01:49

5

創建方法從兩個構造

private init(String name, String address, Integer age) {} 

調用它。

+0

+1,你的想法比我的好:-)。 – 2012-03-05 12:48:41

+2

唯一的問題是,這使得不可能使用最終變量。沒有很好的方式,但使用靜態初始化 - 你可以用構造函數解決它,並沒有代碼重複,但顯然會變得很難看.. – Voo 2012-03-05 12:50:51

+2

+1但是,當變量都是最終的時候這個工作嗎? – 2012-03-05 12:51:50

7

這是我的看法:

public class MyClass { 

    public static MyClass fromCsvLine(String csvLine) { 
     String[] fields = StringUtils.split(csvLine, ','); 
     return new MyClass(fields[3], fields[15], Integer.parseInt([fields[8])); 
    } 

    //... 

} 

用法:

MyClass my = MyClass.fromCsvLine("..."); 
+0

也許'MyClass'不應該「知道」CSV文件,所以放入不同的類(與'toCSVLine'一起可能更有意義)。但是,靜態創建方法肯定是要走的路 - 構造函數有點亂。 – 2012-03-05 14:03:17