Text blocks – opanowujemy długie teksty w Javie.

Text blocks są nową funkcjonalnością w java 15, która dostępna była już od wersji od wersji 13 w fazie preview. Pozwala ona na znacznie prostsze zapisywanie długich, wieloliniowych tekstów. Duże teksty w kodzie Java zawsze wyglądały tragicznie i ulepszenie składni za to odpowiedzialnej było wręcz koniecznością.

Problemy tekstu w kodzie java

Zacznijmy od tego dlaczego ta zmiana była potrzebna. Umieszczając długi tekst w kodzie Java spotykamy się z kilkoma problemami:

Znaki specjalne

Jednym z największych problemów są sekwencje ucieczki znaków specjalnych. Przed wersją 15 musimy dodawać dodatkowo znak “\”, co prowadziło do zupełnie nieczytelnego kodu:

String text = "\"\\";
System.out.println(text);

Powyższy kod daje następujący wynik:

"\
Text wieloliniowy

Kolejny duży problem to łączenie długich, wieloliniowych tekstów. Tradycyjne konstrukcje wyglądają naprawdę nieciekawie:

 String test = "[\n"
            + "  {\n"
            + "    \"id\": 1,\n"
            + "    \"name\": \"testName1\"\n"
            + "  },\n"
            + "  {\n"
            + "    \"id\": 2,\n"
            + "    \"name\": \"testName2\"\n"
            + "  }\n"
            + "]";

Powyższy kod daje następujący wynik:

System.out.println(test);

[
  {
	"id": 1,
	"name": "testName1"
  },
  {
	"id": 2,
	"name": "testName2"
  }
]

Struktura text blocks

Text blocks są bardzo proste w użyciu. Używamy do tego notacji trzech cudzysłowów. Cały text pomiędzy nimi będzie interpretowany bez problemów.

 String test = """
            [
              {
                "id": 1,
                "name": "testName1"
              },
              {
                "id": 2,
                "name": "testName2"
              }
            ]
        """;

Co ciekawe spacje przed tekstem zostaną wycięte do najniższego poziomu. Dzięki temu mechanizmowi wynikowy String będzie wyglądał dokładnie tak jak powinien:

[
  {
	"id": 1,
	"name": "testName1"
  },
  {
	"id": 2,
	"name": "testName2"
  }
]

Wyjątkowe przypadki z text block

Pomimo tego, że text blocks są bardzo prostą konstrukcją, są sytuacje w których musimy użyć znaków specjalnych:

Potrójny cudzysłów

Oczywiste jest, że potrójny cudzysłów musi być odpowiednio oznaczony:

String text = """
            \"""
            """;
Łamanie linii

Czasami linia w text blocks jest za długa. Jeśli złamiemy ją w text blocks, to do wynikowego tekstu automatycznie dodany znak nowej linii. Aby uniknąć takiej sytuacji możemy użyć backslasha:

 String text = """
            bardzo długi tekst \
            który nie zostanie przerwany
            """;
Zachowywanie spacji na końcu linii

Kolejnym ciekawym przypadkiem jest sposób na zachowanie znaków spacji na końcu linii. Standardowo takie spacje są automatycznie usuwane. Aby tego uniknąć musimy użyć ucieczki “\s”.

String text = """
            test       \s
            """;

W wynikowym tekście spacje zostaną zachowane.

Parametryzowanie

Ostatnim przypadkiem, o którym warto powiedzieć jest możliwość wstawiania zmiennych. Do tego została stworzona specjalna metoda formatted():

String text = """
            Variable test - %s
            """.formatted(variable);

Zmienna zostanie podmieniona w miejscu znacznika “%s”. Pozwala to na zgrabne wstawianie zmiennych, bez dodatkowych konstrukcji.

Podsumowanie

Text blocks to jedna z najprzydatniejszych ostatnio dodanych funkcjonalności. Duże bloki tekstów zawsze sprawiały problemy. Ta zmiana naprawia jeden z największych problemów ze składnią javy.

Leave A Comment