Text blocks

Тема дорожной карты · Java

Text Blocks в Java — это функция многострочных строковых литералов, финализированная в Java 15 (в предварительном просмотре в Java 13–14), позволяющая разработчикам встраивать большие блоки текста — SQL-запросы, JSON-данные, HTML-шаблоны, XML и GraphQL-схемы — непосредственно в исходный код без escape-последовательностей или ручной конкатенации. Text Block в Java ограничивается открывающим """, за которым следует новая строка, и закрывающим """, причём JVM автоматически удаляет общие ведущие отступы (случайные пробелы) и интерпретирует символы новой строки буквально, создавая чистый, читаемый исходный код, соответствующий предполагаемой выходной структуре. Text Blocks в Java по-прежнему являются объектами String на JVM: они поддерживают formatted() ("""SELECT * FROM users WHERE id = %d""".formatted(id)), все стандартные методы String и switch-выражения, делая их прозрачным улучшением по сравнению с традиционными строковыми литералами без накладных расходов во время выполнения. Text Blocks в Java значительно улучшают читаемость при работе с SQL-шаблонами PreparedStatement в JDBC, REST-шаблонами Spring, определениями именованных запросов Hibernate, JSON-утверждениями в тестах JUnit 5 и любым другим контекстом, где многострочное содержимое ранее требовало экранирования \n и конкатенации +. Функция Text Blocks является частью более широкой инициативы современных Java-функций и хорошо сочетается с String.formatted(), String.stripIndent() и String.translateEscapes() для программатической работы с текстом на JDK.

Как это работает

Text blocks — это Java 17/21 LTS с фичами, меняющими, как пишется код: records (immutable data), sealed-типы (закрытая иерархия), pattern matching для switch (21+), текстовые блоки, var, switch-выражения, records как pattern-deconstructed типы. Virtual threads (21) драматически упрощают concurrent server-код. Reactive-программирование (Project Reactor, RxJava) ещё актуально, но virtual threads сужают его нишу.

Когда применять

Таргет 21 LTS для новых проектов — одни virtual threads стоят апгрейда. Records — для DTO, sealed-типы — для конечных иерархий, pattern matching — при диспетчеризации по типу. Миграция с reactive (Project Reactor) на virtual threads — где читаемость бьёт async-stream-преимущества. GraalVM native image — когда важны быстрый старт + низкая память (CLI-тулзы, serverless).

Типичные ошибки

Ловушки Text blocks: блокировка на virtual thread внутри synchronized-блока (пиннит carrier — теряет смысл); чрезмерное использование records для mutable-концептов (поля records — final); баги reflection в GraalVM native image (требуют файлы конфигурации); расчёт, что cancellation Reactor идентичен interruption virtual thread (разная семантика).

Связанные понятия

Полезные ресурсы