如何重构返回不同类型List的CSV读取方法?
重构方案:通用泛型方法
哥们,你这四个方法明显是复制粘贴出来的,重复代码不仅看着闹心,后续维护也麻烦。咱们可以用Java泛型把它们整合成一个通用方法,一次性解决重复问题,还能提升代码的可维护性。
先拆解下重复逻辑:四个方法的核心流程完全一致,唯一的差异就是要解析的目标实体类(PersonFirstName/Street/City/PersonLastName)。所以咱们把这个类作为参数传入,用泛型来适配不同的返回类型就行。
重构后的代码
import org.apache.commons.csv.CsvToBean; import org.apache.commons.csv.CsvToBeanBuilder; import java.io.FileReader; import java.io.IOException; import java.nio.file.Path; import java.util.List; public class CsvReader { // 通用CSV读取方法 public <T> List<T> readCsv(Path path, Class<T> targetClass) throws IOException { // 用try-with-resources自动关闭FileReader,避免资源泄漏 try (FileReader reader = new FileReader(path.toString())) { CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(reader) .withType(targetClass) .withSeparator(';') .build(); return csvToBean.parse(); } } // 原来的四个重复方法现在可以直接删掉了 }
调用示例
现在只需要调用这个通用方法,传入对应的类对象就能得到你要的列表:
// 读取PersonFirstName列表 List<PersonFirstName> firstNames = readCsv(yourPath, PersonFirstName.class); // 读取Street列表 List<Street> streets = readCsv(yourPath, Street.class); // 读取City列表 List<City> cities = readCsv(yourPath, City.class); // 读取PersonLastName列表 List<PersonLastName> lastNames = readCsv(yourPath, PersonLastName.class);
额外优化说明
我特意加了try-with-resources语法——原代码里的FileReader没有手动关闭,会造成资源泄漏,用这个语法能让JVM自动在代码块结束后关闭资源,更安全可靠。
另外,以后如果要修改分隔符、添加解析配置(比如忽略空行、设置字符编码),只需要改这一个通用方法就行,不用再逐个修改四个重复方法,维护成本直接降到原来的1/4!
内容的提问来源于stack exchange,提问作者dredster01
相关产品推荐
相关产品推荐

