Есть ли способ повторно использовать память, занятую строкой результата с коротким сроком службы?
Нет.
Или просто другое решение.
Если вы могли бы изменить код, который использует String
объекты, сгенерированные этим методом, принимают вместо него CharSequence
. Тогда вы могли бы передать ему экземпляр StringBuilder
в builder
и избежать вызова toString()
.
Проблема в том, что вы не смогли бы помешать чему-либо привести CharSequence
к StringBuilder
и мутируя. (Но если код не критичен для безопасности, вы можете это проигнорировать. Это будет трудно сделать случайно, особенно если вы используете тип интерфейса CharSequence
при передаче StringBuilder
.)
Другая проблема заключается в том, что вызывающая сторона будет каждый раз получать один и тот же объект с различным состоянием. Он не сможет сохранить состояние ... если только он не вызовет toString()
.
Но вы можете излишне беспокоиться о производительности. G C относительно хорош в работе с недолговечными объектами. Предполагая, что объект недоступен в первом цикле G C после его создания, он никогда не будет помечен или скопирован, а стоимость его удаления будет равна нулю. В первом приближении, это достижимые объекты в «от» пространстве, которые будут вам стоить.
Я бы сначала провел некоторое профилирование и мониторинг G C. Только go по пути изменения кода, как указано выше, если есть явное свидетельство того, что короткоживущие строки вызывают проблемы с производительностью.
(Моя интуиция заключается в том, что 400 краткосрочных строк в секунду не должно быть проблем, если предположить, что 1) они невелики и 2) вы выбрали G C, который подходит для вашего варианта использования.)