Ujorm verze 1.74 obsahuje nový, samostatný modul, který nabízí třídy pro sestavování textových zpráv pomocí šablony a parametrů. Pro srovnání přikládám vzorové použití standardní Java knihovny. Všechny třídy se liší především způsobem zápisu parametrů v šabloně. Použité ukázky kódu jsem zkopíroval z jUnit testů projektu Ujorm.
Třída MsgFormatter
MetodaMsgFormatter.format()
z knihovny Ujorm je určena pro rychlé použití šablony, která označuje vkládané parametry dvojicí složených uvozovek "{}"
, pořadí parametrů vkládaných do šablony je dáno pořadím v metodě. Vzorová ukázka použití je tady: assertEquals("TEST" , MsgFormatter.format("TE{}T", "S"));
assertEquals("TE, S, T", MsgFormatter.format("TE", "S", "T"));
assertEquals("TES{}" , MsgFormatter.format("TE{}{}", "S"));
Výhodou je absence výjimek způsobených chybným počtem parametrů, protože přebytečné parametry se zapisují na konec zprávy oddělené čárkou s mezerou a ty chybějící se pouze nenahradí za značku. Pokud má výsledná zpráva obsahovat sekvenci "{}"
, je nutné ji vložit do šablony jako parametr. Třída nepodporuje formátování hodnot parametrů, v případě takové potřeby použijte raději následující třídu ze stejné knihovny.Třída MessageService
Tato třída je také z knihovny Ujorm. Parametry metodyMessageService.format()
v šabloně se označují výrazem typu "${PRICE}"
, kde PRICE je název parametru, který může být volitelně doplněný formátem podle vzoru "${PRICE,%.2f}"
. Popis formátu je shdoný je shodný s metodou String.format()
. Parametry šablony se předávají v objektu typu Map<String, Object>
, ukázka použití následuje: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On ${DAY,%tF}, we spent ${PRICE,%.2f} EUR.";
MessageService instance = new MessageService();
Map<String,Object> params = instance.map
( "DAY", LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30)
, "PRICE", new BigDecimal("254"));
String result = new MessageService().format(template, params);
assertEquals(expected, result);
Další ukázky použití najdete v jUnit testu. Pro srovnání uvádím dále ještě dvě metody ze standardní Java knihovny.Třída String
Statická metodaString.format()
vytváří interně instanci třídy Formatter
. Pozice parametrů se označují výrazem začínajícím znakem procenta (například "%s"
) a volitelné formátování hodnoty parametru. Příklad použití: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On %tF, we spent %.2f EUR.";
LocalDateTime day = LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30);
String result = String.format(ENGLISH, template, day, new BigDecimal("254"));
assertEquals(expected, result);
Pokud je parametrů méně, než značek, metoda vyhazuje výjimku MissingFormatArgumentException
, pokud je jich naopak více, tak jsou ignrorovány.Třída MessageFormat
Poslední metodaMessageFormat.format()
je také statická metoda ze standardní Java knihovny a také podporuje formátování parametrů. Místo určené pro vkládání pametrů se označuje výrazy číslovanými od nuly podle vzoru "{0}, "{1}"
a konkrétní parametry se vkládájí pomocí pole. Příklad použití: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On {0,date,yyyy-MM-dd}, we spent {1,number,#.00} EUR.";
Date day = Date.from(LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30)
.atZone(ZoneId.systemDefault()).toInstant());
Object[] params = { day, new BigDecimal("254")};
String result = new MessageFormat(template, ENGLISH).format(params);
assertEquals(expected, result);
Výchozí Locale se bere z operačního systému, argument typu java.time.LocalDateTime není bohužel podporovaný a vyhazuje výjimku IllegalArgumentException
.Performance
Přikládám přibližnou výkonnost jednotlivých tříd, tolerance naměřených hodnot může být až 10%. Pro každý formatter proběhlo 5_000_000 iterací ve kterých se do jednoduché šablony (bez formátování) dosadily tři krátké argumenty.
Třída Čas [ms] Výkon(větší je lepší)MsgFormatter 1158 100.00% MessageService 2268 51.06% String 12243 9.46% MessageFormat 5023 23.05%
Další podrobnosti o testu najdete tady, Na závěr přikládám popis Maven závislosti:
<dependency>
<groupId>org.ujorm</groupId>
<artifactId>ujo-tools</artifactId>
<version>1.74</version>
</dependency>
Žádné komentáře:
Okomentovat