TGViewer
Java: fill the gaps Java: fill the gaps @java_fillthegaps · 12.3K subscribers
Post #319 5.17K
Сложение строк, часть 2: java 9

Возьмём код из прошлого поста

String s = s1 + s2 + s3;

Для него компилятор java 8 соберёт байткод:

// Method StringBuilder."(init)":()
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.toString:()

Компилятор java 9 сделает по-другому:

invokedynamic #13

По ссылкам мы придём в метод StringConcatFactory#makeConcatWithConstants

(Подробно про invokedynamic я писала
в этом посте, сейчас не будем углубляться)

В классе StringConcatFactory лежит та же логика со стринг билдером. Но очень параметризуемая: через JVM параметры доступны немного разные реализации и стратегии вычисления исходного размера StringBuilder.

Это слишком глубокие дебри, поэтому не буду расписывать подробно. Почитать про все опции и посмотреть бенчмарки можно тут.

У любой задачи есть цель, поэтому давайте разберёмся, зачем это всё затевалось. Первый вариант, приходящий на ум - увеличение производительности.

Но по бенчмаркам видно, что перенос логики из байткода в java код не увеличил скорость работы.

Второй вариант - большая гибкость. Да, параметров стало больше, но не думаю, что это будет востребовано в большинстве проектов.

Основная цель изменений - это "причёсывание" кода. Что получилось после рефакторинга:

✅ Логичность. Я воспринимаю + как сокращённую форму метода add для строк и ожидаю реализацию этого метода внутри JDK.

✅ Чёткое разделение обязанностей. Работа компилятора - преобразовать конструкции языка в инструкции для JVM. Например, превратить + в вызов метода.

Оптимизации на этом уровне могут быть, но не на уровне "бизнес-логики". Соединить две строчки на этапе компиляции - это одно. Прописать создание объектов и тд - совсем другое.

✅ Легче сделать сложную логику обработки. В классе StringConcatFactory 900 строк с кучей параметров и проверок. Представляете, если такое будет в байткоде? Написал в коде плюсик, а при компиляции получил чудовище.

✅ Легче менять реализацию. Для изменения конкатенации в будущем достаточно поменять код в JDK, и не нужно трогать компилятор. Это снижает количество работы и возможных ошибок.

Если совсем просто, то перенос логики соединения строк из байткода в JDK - это как перенос логики из хранимых процедур в основной код🙂
  • 👍 2
More from @java_fillthegaps
  1. Apr 30, 2026Get Your Hands Dirty on Clean Architecture: отзыв на книгу Когда я подняла тему чистой арх…
  2. Apr 27, 2026​Clean Architecture: отзыв на книгу Наконец-то дочитала книгу Clean Architecture Роберта М…
  3. Mar 4, 2026Как переиспользовать контекст в интеграционных тестах Сегодня расскажу базовый минимум для…
  4. Mar 4, 2026Post #660
  5. Mar 4, 2026Тестовый контекст поднимается 2 минуты. У нас 4 класса с интеграционными тестами, их конфи…
  6. Feb 25, 2026Чистая архитектура. Главы 3-5 Продолжаем спидран по Clean Architecture Роберта Мартина. ⭐️…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →