Как избавиться от 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);