Text blocks (Java 15)

Text block — это строковый литерал, занимающий несколько строк. Введён в Java 13/14 как preview и стабилизирован в Java 15 (JEP 378). Текстовый блок открывается тремя кавычками, переводом строки и закрывается тремя кавычками. Внутри можно свободно писать многострочный текст: HTML, JSON, SQL, конфиги, обучающие задания.

До текстовых блоков многострочные строки приходилось склеивать через + и \n, что было громоздко и плохо читаемо.

Минимальная версия: Java 15.

Синтаксис

String s = """
            первая строка
            вторая строка
            третья строка
            """;

Правила:

  • Открывающие """ обязательно сопровождаются переводом строки.

  • Минимальные общие ведущие пробелы автоматически удаляются (incidental whitespace).

  • Закрывающие """ могут стоять на отдельной строке — её отступ задаёт «нулевой» уровень.

  • Внутри блока разрешены обычные escape-последовательности (\n, \t, \\), а также новые: \s (пробел) и \<line-break> (склейка строк).

Зачем нужно

  • Хорошо читаемый HTML/JSON/SQL прямо в коде.

  • Нет нужды экранировать кавычки внутри.

  • Автоматическая обработка отступов.

  • Меньше шума + "\n" +.

Пример 1. Базовый блок

public class TextBlockBasic {
    public static void main(String[] args) {
        String poem = """
                AlashEd Wiki
                обучает Arduino
                и многому ещё""";
        System.out.println(poem);
    }
}

Output:

AlashEd Wiki
обучает Arduino
и многому ещё

Пример 2. HTML без экранирования

public class TextBlockHtml {
    public static void main(String[] args) {
        String html = """
                <html>
                  <body>
                    <h1>Robot Phobo</h1>
                    <p class="info">Курс по робототехнике</p>
                  </body>
                </html>
                """;
        System.out.println(html);
    }
}

Output:

<html>
  <body>
    <h1>Robot Phobo</h1>
    <p class="info">Курс по робототехнике</p>
  </body>
</html>

Пример 3. JSON

public class TextBlockJson {
    public static void main(String[] args) {
        String json = """
                {
                  "kit": "Robot Phobo",
                  "pins": {
                    "trig": 3,
                    "echo": 7,
                    "servo": 9
                  }
                }
                """;
        System.out.println(json);
    }
}

Output:

{
  "kit": "Robot Phobo",
  "pins": {
    "trig": 3,
    "echo": 7,
    "servo": 9
  }
}

Пример 4. Управление отступом через \s и переносы

public class TextBlockEscape {
    public static void main(String[] args) {
        // \s — литеральный пробел, не обрезается
        String table = """
                pin\sname
                3  \strig
                7  \secho
                """;
        System.out.println(table);

        // \<перевод строки> — склейка длинной строки
        String oneLine = """
                Очень длинная \
                логическая строка \
                в три физические
                """;
        System.out.println(oneLine);
    }
}

Output:

pin name
3   trig
7   echo

Очень длинная логическая строка в три физические

Пример 5. Интерполяция через String.format / formatted

public class TextBlockFormatted {
    public static void main(String[] args) {
        String name = "RobotPhobo";
        int trig = 3, echo = 7;

        // Метод formatted работает как printf для текстового блока
        String report = """
                Робот: %s
                TRIG: D%d
                ECHO: D%d
                """.formatted(name, trig, echo);

        System.out.print(report);
    }
}

Output:

Робот: RobotPhobo
TRIG: D3
ECHO: D7

Пример 6. Кавычки внутри блока

public class TextBlockQuotes {
    public static void main(String[] args) {
        // Одиночные и двойные кавычки внутри блока не нужно экранировать
        String sql = """
                SELECT name, pin
                FROM components
                WHERE category = "sensor"
                  AND name <> 'bluetooth'
                """;
        System.out.println(sql);

        // Чтобы вставить три кавычки подряд — экранируйте одну из них
        String triple = """
                Конец блока выглядит так: \"""
                """;
        System.out.println(triple);
    }
}

Output:

SELECT name, pin
FROM components
WHERE category = "sensor"
  AND name <> 'bluetooth'

Конец блока выглядит так: """

Подводные камни

Предупреждение

  • После открывающих """ обязателен перевод строки. String s = """abc"""; не скомпилируется.

  • Минимальный общий отступ всех строк (включая закрывающие """) считается «нулевым» — двигайте закрывающие кавычки, чтобы регулировать отступ результата.

  • Trailing whitespace в строках обычно обрезается компилятором. Если нужны конкретные пробелы в конце — используйте \s.

  • Если хотите вывести три двойные кавычки внутри блока — экранируйте хотя бы одну: \""".

  • Текстовый блок — это обычный String после компиляции, с теми же методами и ограничениями.

Совет

В Java 15+ существует метод String.formatted(args) — он эквивалентен String.format(this, args) и хорошо сочетается с текстовыми блоками.

См. также

Примечание

Материал основан на официальной документации Oracle Java SE (docs.oracle.com/en/java/javase) и спецификации JEP 378 (openjdk.org/jeps/378), распространяемой под лицензией Oracle Free Documentation License. Тексты и примеры написаны заново для AlashEd Wiki.