Как я могу рефакторинговать методы, возвращающие различные типы списков

#java #csv #generics

Вопрос:

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

Вот мой код:

 public List<PersonFirstName> readPersonFirstNames(Path path) throws FileNotFoundException {

    FileReader reader = new FileReader(path.toString());
    CsvToBean<PersonFirstName> csvToBean = new CsvToBeanBuilder<PersonFirstName>(reader)
            .withType(PersonFirstName.class)
            .withSeparator(';')
            .build();

    return csvToBean.parse();
}

public List<Street> readStreets(Path path) throws FileNotFoundException {

    FileReader reader = new FileReader(path.toString());
    CsvToBean<Street> csvToBean = new CsvToBeanBuilder<Street>(reader)
            .withType(Street.class)
            .withSeparator(';')
            .build();

    return csvToBean.parse();
}

public List<City> readCities(Path path) throws FileNotFoundException {

    FileReader reader = new FileReader(path.toString());
    CsvToBean<City> csvToBean = new CsvToBeanBuilder<City>(reader)
            .withType(City.class)
            .withSeparator(';')
            .build();

    return csvToBean.parse();
}

public List<PersonLastName> readPersonLastNames(Path path) throws FileNotFoundException {

    FileReader reader = new FileReader(path.toString());
    CsvToBean<PersonLastName> csvToBean = new CsvToBeanBuilder<PersonLastName>(reader)
            .withType(PersonLastName.class)
            .withSeparator(';')
            .build();

    return csvToBean.parse();
}
 

Комментарии:

1. Чего вы хотите добиться от рефакторинга? Вы хотите иметь единый метод для всех типов?

2. да, я хочу создать метод, который я могу вызвать в этих 4 методах, чтобы мой код стал меньше

Ответ №1:

 public <T> List<T> read(Path path, Class<T> clazz) throws FileNotFoundException {
    FileReader reader = new FileReader(path.toString());
    CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(reader)
            .withType(clazz)
            .withSeparator(';')
            .build();

    return csvToBean.parse();
}
 

Этот метод разделяет общую логику чтения и принимает класс типа результата в качестве дополнительного параметра.

Пример использования:

 public List<PersonFirstName> readPersonFirstNames(Path path) throws FileNotFoundException {
    return read(path, PersonFirstName.class);
}
 

Комментарии:

1. Объяснение было бы неплохо