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 ;)
3 komentarze:
Jest nawet przyjemniej począwszy od Java 5, gdzie java.lang.String "dostał" zestaw metod format(...), który odpowiada wspomnianej przez Ciebie MessageFormat.format(...).
Jacek
Notatnik Projektanta Java EE
Nie do końca, ponieważ String.format zachowuje się mniej więcej jak znana z C funkcja printf (czyli np. "%s %s - %d" a nie "{0} {1} - {2}").
Eclipse 3.4 też już potrafi zamienić konkatenację na MessageFormat :)
Prześlij komentarz