Pull to refresh

В Java 13 хотят добавить «текстовые блоки»

Reading time2 min
Views9.7K
Original author: Jim Laskey
Блоки текста запланированы к появлению в Java 13. Об этом стало известно из JEP 355.

Блоки текста — это многострочный строковый литерал, который устраняет необходимость в экранировании большинства специальных символов и автоматически делает переносы строки.

Это дальнейшая попытка исследований, начавшихся в 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");

Only registered users can participate in poll. Log in, please.
Нравится ли вам эта фича?
75.81% Да304
3.99% Нет16
7.98% Мне все равно32
2% Да, но я не буду использовать ее8
10.22% Я не пишу на Java41
401 users voted. 27 users abstained.
Tags:
Hubs:
+12
Comments29

Articles