Блокове за текст на Java

1. Въведение

В предишен урок видяхме как можем да използваме многоредови низове във всяка версия на Java и без да активираме функциите за предварителен преглед.

В този урок ще видим как да използваме функцията за визуализация JDK 13/14 на текстови блокове .

2. Използване

От Java 13 текстовите блокове се предлагат като функция за предварителен преглед. Текстовите блокове започват с “” ” (три двойни кавички), последвани от незадължителни интервали и нов ред. Най-простият пример може да изглежда така:

String example = """ Example text""";

Обърнете внимание, че резултатният тип на текстов блок все още е низ . Текстовите блокове просто ни предоставят друг начин за писане на String литерали в нашия изходен код.

В текстовите блокове можем свободно да използваме нови редове и кавички, без да е необходимо да избягваме . Позволява ни да включим буквални фрагменти от HTML, JSON, SQL или каквото ни е необходимо, по по-елегантен и четим начин.

В получения низ, (основният) отстъп и първият нов ред не са включени. Ще разгледаме предаването на отстъпи в следващия раздел.

3. Вдлъбнатина

За щастие, когато използваме текстови блокове, все още можем да правим правилния отстъп на нашия код. За да се постигне това, част от отстъпа се третира като изходен код, докато друга част от отстъпа се разглежда като част от текстовия блок. За да работи това, компилаторът проверява за минималното отстъп във всички непразни редове. След това компилаторът измества целия текстов блок наляво.

Помислете за текстов блок, съдържащ малко HTML:

public String getBlockOfHtml() { return """   example text  """; }

В този случай минималното отстъп е 12 интервала. По този начин всички 12 интервала вляво оти на всички следващи редове се премахват. Нека тестваме това:

@Test void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { String expected = "\n" + "\n" + " \n" + " example text\n" + " \n" + ""; assertThat(subject.getBlockOfHtml()).isEqualTo(expected); } @Test void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() { String expected = "\n\n \n example text\n \n"; assertThat(subject.getBlockOfHtml()) .isEqualTo(expected); }

Когато се нуждаем от изрично отстъпване , можем да използваме по-малко отстъпи за непразен ред (или последния ред):

public String getNonStandardIndent() { return """ Indent """; } @Test void givenAnIndentedString_thenMatchesIndentedOldStyle() { assertThat(subject.getNonStandardIndent()) .isEqualTo(" Indent\n"); }

Освен това можем да използваме и екраниране в текстови блокове, както ще видим в следващия раздел.

4. Бягство

Вътре в текстовите блокове не трябва да се избягват двойни кавички и нови редове. Въпреки това можем да използваме избягване, за да добавим, например, връщане на карета ( \ r ) или раздели ( \ t ) към текстов блок. Дори бихме могли да използваме „“ “отново в нашия текстов блок, като избягаме от един от двойните кавички:

public String getTextWithEscapes() { return """ fun with\n whitespace\t\r and other escapes \""" """; }

Имайте предвид, че тъй като не трябва да се избягват единични двойни кавички и нови редове, се счита за лоша практика да се избягват.

Също така имайте предвид, че дори ако изходният файл има окончания на редове на Windows ( \ r \ n ), текстовите блокове ще бъдат прекратени само с нови редове ( \ n ) . Ако се нуждаем от връщане на карета ( \ r ), трябва да ги добавим изрично към текстовия блок:

public String getTextWithCarriageReturns() { return """ separated with\r carriage returns"""; } @Test void givenATextWithCarriageReturns_thenItContainsBoth() { assertThat(subject.getTextWithCarriageReturns()) .isEqualTo("separated with\r\ncarriage returns"); }

5. Форматиране

За помощ при заместване на променливи е добавен нов метод, който позволява извикването на метода String.format директно върху Stral литерала :

public String getFormattedText(String parameter) { return """ Some parameter: %s """.formatted(parameter); }

Всички тези функции вече предоставят много мощна функция. Java 14 обаче включва някои допълнителни функции. Ще видим повече за това по-нататък.

6. Нови Escape последователности в Java 14

Вторият предварителен преглед на функцията Text Blocks добавя две допълнителни изходни последователности.

6.1. Избягващи линейни терминатори

Понякога може да имаме дълги редове текст в нашия изходен код, които искаме да форматираме по разбираем начин. Втората визуализация добави функция, която ни позволява да направим това. Можем да избягаме от нов ред, така че той да бъде игнориран :

public String getIgnoredNewLines() { return """ This is a long test which looks to \ have a newline but actually does not"""; }

Всъщност този Stral литерал просто ще се равнява на нормален непрекъснат String :

@Test void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() { String expected = "This is a long test which looks to have a newline but actually does not"; assertThat(subject.getIgnoredNewLines()) .isEqualTo(expected); }

6.2. Бягство от пространства

Компилаторът игнорира всички последващи интервали в текстови блокове . Обаче от втория предварителен преглед можем да избягаме от пространство, като използваме новата секвенция за бягство \ s . Компилаторът също така ще запази всички интервали пред това избягало пространство.

Нека разгледаме по-отблизо въздействието на избягало пространство:

public String getEscapedSpaces() { return """ line 1······· line 2·······\s """; } @Test void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() { String expected = "line 1\nline 2 \n"; assertThat(subject.getEscapedSpaces()) .isEqualTo(expected); } 

Забележка : интервалите в примера по-горе се заменят със символа '·', за да станат видими.

Компилаторът ще премахне интервалите от първия ред. Вторият ред обаче се прекратява с избягало пространство и по този начин всички пространства се запазват.

7. Заключение

В този кратък урок разгледахме функцията Java Text Blocks. Може да не е игра за смяна на играта, но ни помага да напишем по-добър и по-четим код, което обикновено е нещо добро.

Както винаги, пълният изходен код на статията е достъпен в GitHub.