Java:重载相互调用的构造函数

Java:重载相互调用的构造函数,java,constructor,overloading,Java,Constructor,Overloading,考虑一个类,该类从CSV行中找到的数据实例化,并存储其一些字段。为这个类创建两个构造函数是有意义的——一个来自原始CSV行,另一个带有显式变量赋值 e、 g 公共MyClass(字符串csvLine) { String[]fields=StringUtils.split(csvLine,,); 这(字段[3],字段[15],Integer.parseInt([fields[8]); } 公共MyClass(字符串名称、字符串地址、整数期限) { this.name=name; 这个地址=地址;

考虑一个类,该类从CSV行中找到的数据实例化,并存储其一些字段。为这个类创建两个构造函数是有意义的——一个来自原始CSV行,另一个带有显式变量赋值

e、 g

公共MyClass(字符串csvLine)
{
String[]fields=StringUtils.split(csvLine,,);
这(字段[3],字段[15],Integer.parseInt([fields[8]);
}
公共MyClass(字符串名称、字符串地址、整数期限)
{
this.name=name;
这个地址=地址;
这个。年龄=年龄;
}
在Java中,这会失败,因为:

构造函数调用必须是 构造函数WhereOnEarth.java

实现这一点的正确方法是什么?

创建一个方法

private init(String name, String address, Integer age) {}
从两个构造函数调用它。

以下是我的看法:

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("...");

我不会混合表示已解析内容的类和内容解析类。我会创建一个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]));
    }

    //...
}

唯一的问题是,这使得不可能使用最终变量。除了使用静态初始值设定项之外,这并不是一个好办法——你们可以用构造函数和代码复制来解决这个问题,但显然这会变得很难看。我更喜欢这种方法(双关!)由于它便于测试。+1这也可能是
MyClass
,例如
MyClass.parse(String csv)
(如果不介意稍微混合!)@DNA:yep,请参阅我的答案。尽管解析有点复杂(或者有多个源,例如XML),非常鼓励解耦。我只对util类使用静态,如StringUtils等。在编写工厂时,我会为继承而设计,因此如果可能的话,不使用静态。但是,如果您愿意,可以将其设置为静态内部类。为什么它是一个实例方法?@TomHawtin-tackline:我支持非静态方法。
MyClassFactory
可能是有状态的,例如持有CSV解析配置/验证规则。可能
MyClass
不应该“知道”CSV文件,因此放入不同的类(以及
toCSVLine
可能更有意义)。但当然静态创建方法是一种方法-构造函数有点混乱。