środa, 11 czerwca 2008

MessageFormat - c.d.

MessageFormat to np. świetne narzędzie do formatowania różnych walut:

Object[] arg = new Object[] {1.32};
String pattern = "{0,number,currency}";
Locale us = new Locale("us", "US");
Locale pl = new Locale("pl", "PL");
Locale de = new Locale("de", "DE");

MessageFormat format = new MessageFormat(pattern, pl);
System.out.println(MessageFormat.format("PL: {0}", format.format(arg)));

format = new MessageFormat(pattern, us);
System.out.println(MessageFormat.format("US: {0}", format.format(arg)));

format = new MessageFormat(pattern, de);
System.out.println(MessageFormat.format("DE: {0}", format.format(arg)));


W wyniku dostajemy:


PL: 1,32 zł
US: USD 1.32
DE: 1,32 €


Jest wiele innych zastosowań tej klasy, po dokumentację zapraszam tutaj: http://java.sun.com/j2se/1.4.2/docs/api/java/text/MessageFormat.html
.

sobota, 7 czerwca 2008

MessageFormat

OK, za inspiracją Radka Holewy, postaram się choć trochę rozruszać mojego bloga ;)

Wezmę na warsztat bardzo ciekawą klasę MessageFormat w Javie. Pisząc kod pod IntelliJ IDEA, w momencie kiedy używamy konkatenacji Stringów, np.


"Masz na imię: " + imie + ", na nazwisko: " + nazwisko + ", masz " + wiek + " lat. "


środowisko podpowiada nam, żeby użyć StringBuildera lub MessageFormat. Decydując się na StringBuildera, otrzymujemy coś takiego:


new StringBuilder().append("Masz na imię: ").append(imie).append(", na nazwisko: ").append(nazwisko).append(", masz ").append(wiek).append(" lat. ").toString()


Umówmy się, że nie jest to najmilsze dla oka rozwiązanie ;) Zupełnie inaczej sprawa ma się z MessageFormat. Korzystając z opcji "replace (...) with java.text.MessageFormat call", otrzymujemy:


MessageFormat.format("Masz na imię: {0}, na nazwisko: {1}, masz {2} lat. ", imie, nazwisko, wiek);


Wow! Wygląda to znacznie bardziej seksownie. W pierwszym Stringu mamy treść tekstu z ponumerowanymi zmiennymi, pozostałe argumenty to użyte w Stringu zmienne. Przykład ten pokazuje, jak wiele ciekawostek można poznać, korzystając z naprawdę dobrego środowiska programistycznego ;)


"OK, wygląda to ładnie, ale co z wydajnością?" - zapyta dociekliwy Czytelnik. Stringi są niemutowalne (immutable), wobec czego wyrażenie typu string1 + string2 jest wysoce nieefektywne (tworzony jest po prostu nowy obiekt z połączenia dwóch pierwszych). Do operacji łączenia Stringów powinno się używać zatem StringBuilder lub StringBuffer. Tak też jest w przypadku MessageFormat - używa StringBuffer do budowania ciągu wyjściowego.

Reasumując, używanie MessageFormat jest nie tylko ładniejsze, ale też bardziej efektywne. Mały benchmark oraz szerszy pokaz możliwości MessageFormat postaram się opisać w następnym poście ;)