3. Оптимизировать построение сообщения об ошибках
Условие задачи:
Дан Spring-компонент, который формирует строковое сообщение со списком ошибок.
Необходимо исправить проблемы в реализации:
убрать неэффективную конкатенацию строк внутри цикла;
корректно оформить строковые литералы;
сохранить исходный формат сообщения.
Код:
@Component
public class Task2 {
public String buildAuditMessage(List<String> errors) {
String msg =
"В процессе обработки возникли следующие проблемы: \n";
for (String error : errors) {
msg += error + "\n";
}
return msg;
}
}
Спойлеры к решению
Подсказки
String в Java неизменяемый, поэтому конкатенация через += в цикле создаёт новые объекты.💡 Для последовательного построения строки лучше использовать
StringBuilder.💡 Добавлять перенос строки можно через
append('\n').Решение
@Component
public class Task2 {
public String buildAuditMessage(List<String> errors) {
StringBuilder message = new StringBuilder(
"В процессе обработки возникли следующие проблемы:\n"
);
for (String error : errors) {
message.append(error)
.append('\n');
}
return message.toString();
}
}
В исходном варианте внутри цикла выполнялась операция:
msg += error + "\n";
Поскольку String неизменяемый, при каждой такой конкатенации создаётся новая строка и копируется уже накопленное содержимое.
StringBuilder изменяет внутренний буфер:
message.append(error)
.append('\n');
поэтому подходит для построения строки в цикле значительно лучше.
Также для одиночного символа переноса строки используется:
'\n'
а не строка "\n".
В результате код становится проще и эффективнее.
Для n ошибок и суммарной длины результата L построение сообщения через StringBuilder работает за O(L). При многократной конкатенации через += объём копирования может расти квадратично относительно размера формируемой строки.