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: