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

Ada*_*tan 4 java constructor overloading

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

例如,

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;
}
Run Code Online (Sandbox Code Playgroud)

在Java中,这会失败,因为:

构造函数调用必须是构造函数WhereOnEarth.java中的第一个语句

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

Tom*_*icz 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]));
    }

    //...

}
Run Code Online (Sandbox Code Playgroud)

用法:

MyClass my = MyClass.fromCsvLine("...");
Run Code Online (Sandbox Code Playgroud)


SJu*_*n76 5

创建一个方法

private init(String name, String address, Integer age) {}
Run Code Online (Sandbox Code Playgroud)

从两个构造函数中调用它.

  • 唯一的问题是这使得无法使用最终变量.没有很好的方法,但使用静态初始化程序 - 你可以用构造函数解决它,没有代码重复,但显然会变得丑陋.. (2认同)
  • +1但是当变量都是最终变量时,这会起作用吗? (2认同)

Tim*_*the 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]));
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)