Блоки текста запланированы к появлению в Java 13. Об этом стало известно из JEP 355.
Блоки текста — это многострочный строковый литерал, который устраняет необходимость в экранировании большинства специальных символов и автоматически делает переносы строки.
Это дальнейшая попытка исследований, начавшихся в JEP 326(необработанные строковые литералы, был отозван).
В Java для встраивания объектов XML, HTML, JSON и т.п. обычно требуется значительное редактирование с экранированием и конкатенацией строк. Фрагмент часто трудно читать и трудно поддерживать.
Соответственно, новый JEP улучшает как и удобочитаемость, так и добавляет возможность записи широкого класса программ на Java — используя строку состоящую из нескольких «строк» и без визуального беспорядка спец. символов. По сути, это двумерный блок текста, а не одномерная последовательность символов.
Блоки строк обрамляются
Блоки могут содержать символы кавычек(
Перенос строк делается автоматически. Использование \n разрешено, но не рекомендуется.
аналогично
или
Вот пример пустого блока текста:
Вот плохая практика использования блоков текста:
Escape-последовательности интерпретируются. Это означает, что разработчики могут писать escape-последовательности, например,
Блоки текста — это многострочный строковый литерал, который устраняет необходимость в экранировании большинства специальных символов и автоматически делает переносы строки.
Это дальнейшая попытка исследований, начавшихся в JEP 326(необработанные строковые литералы, был отозван).
Цели JEP 355
- Упрощение написания Java кода избегая escape-последовательностей.
- Повышение читаемости кода.
То, чего JEP 355 точно не пытается достичь
- Это не попытка определить новый ссылочный тип, как
java.lang.String
. - Это не попытка переопределить строковой оператор "+".
- Блоки текста не поддерживают интерполяцию строк. Эта возможность может быть добавлена в последующих JEP'ах.
Мотивация
В Java для встраивания объектов XML, HTML, JSON и т.п. обычно требуется значительное редактирование с экранированием и конкатенацией строк. Фрагмент часто трудно читать и трудно поддерживать.
Соответственно, новый JEP улучшает как и удобочитаемость, так и добавляет возможность записи широкого класса программ на Java — используя строку состоящую из нескольких «строк» и без визуального беспорядка спец. символов. По сути, это двумерный блок текста, а не одномерная последовательность символов.
Синтаксис и описание
Блоки строк обрамляются
"""
и """
справа и слева. Содержание блока начинается с первого символа после """
и заканчивается на последнем символе перед """
. Тройные кавычки выбраны для того чтобы было понятно, что это строки текста, но чтобы можно было отличить их от обычного строкового литерала("..."
).Блоки могут содержать символы кавычек(
"
) напрямую, без слэша(\
). Можно использовать и \"
, но это не рекомендуется делать. Перенос строк делается автоматически. Использование \n разрешено, но не рекомендуется.
"""
line 1
line 2
line 3
"""
аналогично
"line 1\nline 2\nline 3\n"
или
"line 1\n" +
"line 2\n" +
"line 3\n"
Вот пример пустого блока текста:
String empty = """
""";
Вот плохая практика использования блоков текста:
String a = """""";
String b = """ """;
String c = """
";
String d = """
abc \ def
""";
Escape-последовательности в блоках текста
Escape-последовательности интерпретируются. Это означает, что разработчики могут писать escape-последовательности, например,
\n
внутри блоков.Примеры
HTML
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
Старый способ
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
SQL
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
Старый способ
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
"WHERE `CITY` = 'INDIANAPOLIS'\n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;\n";
Скрипт
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("""
function hello() {
print('"Hello, world"');
}
hello();
""");
Старый способ
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("function hello() {\n" +
" print('\"Hello, world\"');\n" +
"}\n" +
"\n" +
"hello();\n");
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Нравится ли вам эта фича?
75.81% Да304
3.99% Нет16
7.98% Мне все равно32
2% Да, но я не буду использовать ее8
10.22% Я не пишу на Java41
Проголосовал 401 пользователь. Воздержались 27 пользователей.