Как избавиться от enum класса?

public class ReportBuilder {
private final DataParser parser = new DataParser();
private final DataReader reader = new DataReader();
private List<ReportRecord> recordList;

enum EndOrStart {
    END, START
}

public List<String> prepareReport(String startFile, String endFile, String abbrevFile) {
    formatChart(abbrevFile);
    addTime(startFile, EndOrStart.START);
    addTime(endFile, EndOrStart.END);
    recordList.forEach(rec -> rec.setTimeDiff(rec.getEndTime().toNanoOfDay()-rec.getStartTime().toNanoOfDay()));
    sortByDiffTime();
    return collectReport();

}

private Stream<String> recordToString(int index) {
    String timeFormat = "m:ss.SSS";
    String reportFormat = "%d. %s | %s | %s";
    String delimiter = "-".repeat(60);
    ReportRecord dataRecord = recordList.get(index);
    String name = dataRecord.getName();
    String team = dataRecord.getTeam();
    String time = LocalTime.ofNanoOfDay(dataRecord.getTimeDiff()).format(DateTimeFormatter.ofPattern(timeFormat));
    String result = String.format(reportFormat, 1 + index, name, team, time);
    return (1 + index) % 15 == 0
            ? Stream.of(result, delimiter)
            : Stream.of(result);
}

private ArrayList<String> collectReport() {
    return IntStream.range(0, recordList.size())
            .mapToObj(this::recordToString)
            .flatMap(s -> s)
            .collect(Collectors.toCollection(ArrayList::new));
}

private void formatChart(String abbrevFile) {
    List<String> abbrevList = reader.readFile(abbrevFile);
    recordList = new ArrayList<>(abbrevList.size());
    abbrevList.stream().sorted(Comparator.naturalOrder())
            .forEach(line -> recordList.add(parser.parseRacer(line)));
}

private void addTime(String timeFile, EndOrStart startOrEndFile) {
    List<String> timeStringList = reader.readFile(timeFile);
    timeStringList.sort(Comparator.naturalOrder());
    List<LocalTime> timeList = timeStringList.stream().map(parser::parseTime).collect(Collectors.toList());
    if (startOrEndFile.equals(EndOrStart.START)) {
        recordList.forEach(rec -> rec.setStartTime(timeList.get(recordList.indexOf(rec))));
    }
    if (startOrEndFile.equals(EndOrStart.END)) {
        recordList.forEach(rec -> rec.setEndTime(timeList.get(recordList.indexOf(rec))));
    }
}

В методе addTime я добавляю в экземпляры класса ReportRecord данные о времени старта(startTime) и времени финиша (entTime). Чтобы сделать метод addTime универсальным, я дважды вызываю его в методе prepareReport и передаю вторым параметром enum, где указано какому полю я присваиваю значение. Как можно избавиться от использования enum класса и сохранить универсальность метода addTime?


Ответы (1 шт):

Автор решения: Serodv

В простейшем случае можно заменить enum на флаг true/false. Более красивый и универсальный вариант - передача логики поведения в метод в качестве параметра.

private void addTime(String timeFile, BiConsumer<ReportRecord, LocalTime> consumer) {
        List<String> timeStringList = reader.readFile(timeFile);
        timeStringList.sort(Comparator.naturalOrder());
        List<LocalTime> timeList = timeStringList.stream().map(parser::parseTime).collect(Collectors.toList());
        recordList.forEach(rec -> consumer.accept(rec, timeList.get(recordList.indexOf(rec))));
    }

ну и вызов:

addTime(startFile, ReportRecord::setStartTime);
addTime(endFile, ReportRecord::setEndTime);
→ Ссылка