String Templates mit Java (Tausend Wege führen nach Rom)

Um lange Zeichenketten (Strings) mit Werten zu füllen, bietet sich das Java MessageFormat an:

1
2
3
4
5
6
7
8
9
10
11
12
  public static void main(String[] args) throws Exception
  {
    String template = "My name is {0} {1}."
            + System.getProperty("line.separator", "\r\n")
            + "I am {2} years old.";
    Object[] values = new Object[]
    {
      "Benny", "Neugebauer", 24
    };
    String sentence = MessageFormat.format(template, values);
    System.out.println(sentence);
  }

Die Ausgabe wäre hierfür:

My name is Benny Neugebauer.
I am 24 years old.

Möglich wäre auch dieser Einzeiler:

String sentence = String.format("My Name is %s %s.%sI am %d yars old.", "Benny", "Neugebauer",  System.getProperty("line.separator"), 24);

Man könnte ebenso String Templates verwenden, müsste dann aber Bibliotheken wie etwa ANTLR (Five minute Introduction in ANTLR String Templates) verwenden. Natürlich kann man Strings auch verketten (konkatenieren), was aber wenig übersichtlich ist:

1
2
3
4
5
6
7
8
9
10
    String sentence = "My Name is "
            +"Benny"
            +" "
            +"Neugebauer"
            +"."
            +System.getProperty("line.separator")
            +"I am "
            +24
            +" years old.";
    System.out.println(sentence);

Hinsichtlich der Performanz, sind String Builder besser geeignet als die Konkatenation von Zeichenketten:

1
2
3
4
    StringBuilder sb = new StringBuilder("My name is ").append("Benny ");
    sb.append("Neugebauer").append(".").append(System.getProperty("line.separator"));
    sb.append("I am").append(24).append(" years old.");
    System.out.println(sb.toString());

Wie man an diesen kurzen Beispielen sieht gibt es viele Möglichkeiten, die zum Ergebnis führen. Mir gefällt derzeit das Message Format am besten. Das Message Format ist für den Standard Java-Logger (java.util.logging.Logger) sogar das von NetBeans 7 bevorzugte Format für Log-Nachrichten.