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.