Java 21

Java 21 je najnovija LTS (long-term support) verzija Java platforme i kao takva donosi mnoštvo novina. Među njima su i String Templates (string šabloni). Oni na čitljiv, održiv i efikasan način rešavaju problem generisanja dinamičkih string vrednosti.

Uzmimo za primer konverziju objekta neke klase u JSON format (slika 1):

 

Film film = new Film(1, “Avengers: Endgame”, 182);

String jsonFilm

“{\r\n”

\”id\”: \”” + film.getId() + “\”\r\n”

\”naziv\”: \”” + film.getNaziv() + “\”\r\n”

\”trajanje\”: \”” + film.getTrajanje() + “\”\r\n”

“}”;

System.out.println(jsonFilm);

 

Rezultat:

 

{

“id”: “1”

“naziv”: “Avengers: Endgame”

“trajanje”: “182”

}

 

Slika 1. Klasičan način dobijanja dinamičke string vrednosti

 

Dinamička vrednost se u ovakvoj implementaciji dobija konkatenacijom promenljivih na mnoštvo literala. Ovakva sintaksna konstrukcija je nepregledna i otvara mogućnost za pravljenje grešaka, osim ukoliko se do nje nije došlo automatskim generisanjem koda, ali i tada ostaje nepraktična za održavanje. Dodatno, ako prevodilac ne obavi optimizaciju ovog izraza, dolazi do nove alokacije string-a pri svakoj konkatenaciji, što nije optimalno. Problem se dodatno komplikuje ukoliko traženi string treba da bude višelinijski, a da ostane pregledan za čitanje. StringBuilder i srodne klase iz Java standardne biblioteke nude rešenje za deo ovih problema (konkretno optimizacije), ali kod čine znatno više verboznim.

Na slici 2 se može videti ekvivalentna implementacija dobijena upotrebom String Templates sintakse:

Film film = new Film(1, “Avengers: Endgame”, 182);

String jsonFilm

STR.“””

{

“id”: “\{film.getId()}”

“naziv”: “\{film.getNaziv()}”

“trajanje”: “\{film.getTrajanje()}”

}

“””;

System.out.println(jsonFilm);

Slika 2. String Templates sintaksa

 

Template expressions (šablonski izrazi) dozvoljavaju umetanje Java izraza (validnih u scope-u pripadajuće naredbe) u sklopu običnog ili višelinijskog string-a. Za vreme izvršavanja programa, izrazi se evaluiraju i rezultujuće vrednosti se upisuju u string na mestu navođenja izraza.

Rezultat je isti, ali je sintaksa značajno čitljivija i lakša za održavanje, a po specifikaciji ne dovodi do suvišnih alokacija, što rezultuje optimalnom performansom.

Više primera možete videti u zvaničnoj dokumentaciji:

https://openjdk.org/jeps/430