Java: перегрузка конструкторов, которые вызывают друг друга - PullRequest
4 голосов
/ 05 марта 2012

Рассмотрим класс, который создается из данных, найденных в строке 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;
}

В Java это не работает, потому что:

вызов конструктора должен быть первым оператором в конструктор WhereOnEarth.java

Как правильно это реализовать?

Ответы [ 3 ]

7 голосов
/ 05 марта 2012

Вот мой дубль:

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("...");
5 голосов
/ 05 марта 2012

Я бы не смешивал класс, представляющий проанализированный контент, и класс синтаксического анализа контента. Я хотел бы создать 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]));
    }

    //...
}
5 голосов
/ 05 марта 2012

Создать метод

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

Вызовите его из обоих конструкторов.

...