Исправление проблем в коде

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). При многократной конкатенации через += объём копирования может расти квадратично относительно размера формируемой строки.