Text Blocks

Text Block (Java 15) — многострочная строка без склейки и экранирования. Если нужно вставить в код JSON, SQL, HTML или XML — раньше приходилось клеить строки через + и экранировать кавычки. Text Block пишется «как есть».

// Раньше — боль
String json = "{\n" +
              "  \"name\": \"Артур\",\n" +
              "  \"age\": 28\n" +
              "}";

// Text Block — просто пишем текст
String json = """
        {
          "name": "Артур",
          "age": 28
        }
        """;

Открывается """ с переносом строки, закрывается """ на отдельной строке. Всё между ними — содержимое строки.

Отступы — Text Block умно убирает общий отступ. Позиция закрывающего """ задаёт сколько пробелов срезать слева — код можно красиво выровнять в IDE, итоговая строка будет без лишних пробелов.

// Подходит для SQL
String sql = """
        SELECT u.name, u.email
        FROM users u
        WHERE u.active = true
        ORDER BY u.name
        """;

// И для HTML-шаблонов
String html = """
        <html>
          <body>
            <h1>%s</h1>
          </body>
        </html>
        """.formatted(title);
Копнуть глубже

Управление отступом через позицию """:

String a = """
        hello
        world
        """;   // ← закрывающий """ в колонке 8 → срезает 8 пробелов
// результат: "hello\nworld\n"

String b = """
        hello
        world
""";   // ← закрывающий """ в колонке 0 → ничего не срезает
// результат: "        hello\n        world\n"

Три служебных метода для Text Blocks:

// stripIndent() — убрать общий отступ (то что Text Block делает автоматически)
String s = "  hello\n  world".stripIndent(); // "hello\nworld"

// translateEscapes() — обработать \n, \t и т.д. в обычной строке
String s2 = "line1\\nline2".translateEscapes(); // "line1\nline2"

// formatted() — как String.format() но как метод экземпляра
String msg = """
        Hello, %s!
        You have %d messages.
        """.formatted(name, count);

\ в конце строки — подавляет перенос строки (для очень длинных строк):

String s = """
        Очень длинная строка которую хочется \
        перенести в коде но не в результате
        """;
// результат: "Очень длинная строка которую хочется перенести в коде но не в результате\n"
🎤 Закрыл тему, если можешь объяснить:
• зачем Text Blocks и чем они удобнее склейки строк через +;
• как работает автоматическое удаление отступов (если дошёл до 2-го слоя).