2016-03-26 1 views
0

Я реализую метод Utility, который принимает параметр String как параметр и преобразовывает объект в общий. Я могу достичь с помощью кода ниже, но слабая точка - . Каждый объект, который должен разбираться, должен иметь конструктор строк. Нет способа определить, что объект должен иметь конструктор String. Есть ли другой лучший способ достичь этого, используя полиморфизм или общий?Общий способ преобразования строки в объект

AAA.java

public class AAA { 
    private String id; 
    private String description; 

    public AAA(String str) { 
     // Do parsing... 
    } 

метод Utility.

public static <T extends Base> List<T> readFile(File file, Class<T> type) { 
    List<T> collection = new ArrayList<T>(); 
    // Read file line by line and convert to Instance 

    Constructor<T> ctor = type.getConstructor(String.class); 
    T newInstance = ctor.newInstance(line); 
    if (newInstance != null) { 
     collection.add(newInstance); 
    } 
    return collection; 
} 

Использование:

List<AAA> list = FileUtil.readFile(file, AAA.class); 
+0

В каком формате находится ваша строка? Вернее, ваш файл. Разделяет ли это CSV-запятая или находится в JSON или что-то в этом роде. –

+0

Вы сами решаете формат строки? –

+0

@ DanielvanHeerden это CSV. – swemon

ответ

0

Я предполагаю, что ваши классы POJO (тот, который на самом деле содержат данные), как правило, в формате, который вы имеете в вашем примере. Значение всех полей: String. Если это не так, мое решение нуждается в небольшом усовершенствовании.

Мое предложение - использовать отражение для используемого вами случая. Я был очень успешным с этим в прошлом. Хотя отражение может представлять собой серьезные штрафные санкции, если они применяются плохо.

Анализ кода может выглядеть примерно следующим образом. Я опускаю заголовок метода, так как тот, который вы предоставляете, уже выглядит хорошо. Код, который я предоставляю, будет предполагать, что в переменной String[]line мы найдем уже обработанную строку вашего CSV-файла. Каждый элемент массива содержит один столбец строки CSV.

String[] line; // initialised as explained above 
T newInstance = T.newInstance(); // invoke default constructor 
Field[] fields = newInstance.getClass().getDeclaredFields(); // use reflection to read all fields 
int count = 0; 
for(Fields f : fields) { 
    f.set(newInstance, line[count]); 
    count++; 
} 

Отказ от ответственности: Приведенный выше код не имеет границ! Предполагается, что строки CSV и количество полей в классе имеют одинаковую длину!

На объектах Field, что я обычно делаю, нужно также позвонить getAnnotation, чтобы проверить, установлена ​​ли определенная аннотация в поле. Это позволяет создавать классы так:

public class AAAAnnotated { 

    @MyCSVAnnotation 
    String field1; 

    @MyCSVAnnotation 
    String field2; 

    String field3; 
} 

Если ваш код проверяет, является ли или нет поля аннотированные с аннотациями вы даже можете контролировать в классах POJO поля для загрузки формы CSV и которые, чтобы оставить нетронутыми.

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