2012-03-05 4 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 Это также рекомендуется «Эффективная Java». Благодаря! –

+0

+1 Это также может быть статический заводский метод в 'MyClass', например. 'MyClass.parse (String csv)' (если вы не против смешения _little_!) – DNA

+0

@DNA: да, см. Мой ответ. Хотя если синтаксический анализ немного сложнее (или существует более одного источника, например XML), развязка очень приветствуется. –

5

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

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

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

+0

+1, ваша идея лучше, чем моя :-). –

+2

Проблема только в том, что это делает невозможным использование конечных переменных. Ничего хорошего, но используя статический инициализатор - ну, вы можете решить его с помощью конструкторов и не дублировать код, но, очевидно, это становится уродливым. – Voo

+2

+1 Но будет ли это работать, когда переменные окончательны? –

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' может иметь больше смысла). Но, конечно, статический метод создания - это путь - конструктор - это немного беспорядок. –

Смежные вопросы