2009-04-21 13 views

Antwort

49
String test = String.format("test goes here %s more text", "Testing"); 

ist die nächste Sache, die Sie in Java

+4

Danke für die Antwort. Ich denke, ich bleibe bei der Verkettung, lesbarer mit vielen Variablen. –

0

Was Sie wollen, heißt String interpolation. In Java ist das nicht möglich, obwohl das JRuby, Groovy und wahrscheinlich andere JVM-Sprachen tun.


Edit: wie für Eleganz, können Sie einen StringBuffer verwenden oder überprüfen Sie die andere Poster-Lösung. Aber auf der niedrigen Ebene wird dies immer Verkettung sein, wie die anderen Plakate sagten.

1

Es kann durch einige Template-Bibliotheken getan werden. Aber Vorsicht, Strings sind in Java unveränderlich. In jedem Fall wird die Verkettung auf einem niedrigen Niveau durchgeführt.

1

Sie werden immer eine Form der Verkettung verwenden, um für diese schreiben könnte (vorausgesetzt, Wert1 ist keine Konstante, wie Sie hier zeigen).

Die Art, wie Sie es geschrieben haben, wird implizit ein StringBuilder konstruieren und es zum Verketten der Zeichenfolgen verwenden. Eine andere Methode ist , die zu sprintf von C analog ist. Aber selbst mit format() können Sie Konkatenation nicht vermeiden.

Ja, ich weiß, dass die Ankerverbindung unterbrochen ist.

0

Sie können this freie Bibliothek verwenden. Es gibt Ihnen sprintf wie Funktionalität. Oder verwenden Sie die statische Methode String.format, sofern Sie Java 5 oder neuer verwenden.

25

Eine elegantere Weg könnte sein:

String value = "Testing"; 
String template = "text goes here %s more text"; 
String result = String.format(template, value); 

Oder alternativ mit Message:

String template = "text goes here {0} more text"; 
String result = MessageFormat.format(template, value); 

Hinweis, wenn Sie diese Protokollierung zu tun, dann können Sie die Kosten vermeiden dies durchzuführen, wenn die Protokollzeile unter dem Schwellenwert liegen würde. Zum Beispiel mit SLFJ:

Die folgenden zwei Zeilen ergeben genau die gleiche Ausgabe. Das zweite Formular wird jedoch im Falle einer deaktivierten Protokollierungsanweisung das erste Formular um mindestens den Faktor 30 übertreffen.

logger.debug("The new entry is "+entry+"."); 
logger.debug("The new entry is {}.", entry); 
+1

+1 für MessageFormat - ich habe danach gesucht! –

+0

Schauen Sie sich Rythm (https://github.com/greenlaw110/rythm/downloads) an, was Ihnen erlaubt, etwas wie "String result = Rythm.render" ("Text geht hier @value more text", "Testing") '' zu machen . Nicht nur klarer als 'String.format', sondern auch schnell. Es ist 2 mal schneller als String.format –

0

Warum denken Sie, String-Verkettung nicht elegant ist?

Wenn alles, was Sie tun, ist einfache Verkettung, würde ich argumentieren, dass Code Lesbarkeit ist wichtiger und ich würde es verlassen, wie Sie es haben. Es ist besser lesbar als mit einem StringBuilder.

Leistung wird nicht das Problem sein, dass die meisten Leute denken, dass es ist.

Lesen Sie diese von CodingHorror

+0

Ich stimme zu, ich bleibe bei der Verkettung über die .format-Methode. Ich habe auf eine String-Evaluierung ähnlich wie PHP gehofft. –

0

würde ich einen String verwenden .. es eine gängige Praxis ist, wenn Sie mit Strings handelt. Es kann ein wenig scheinen, wenn man es zum ersten Mal zu sehen, aber Sie werden schnell daran gewöhnen ..

String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString(); 

Strings sind unveränderlich damit eine neue Instanz nach jeder Verkettung erstellt wird. Dies kann bei der Verwendung in Schleifen zu Leistungsproblemen führen.

String Wandelbare Version von String - das heißt, Sie erstellen können, ändern Sie es, wie Sie wollen, und Sie haben immer noch nur eine Instanz. Bei Bedarf können Sie eine String-Repräsentation des StringBuffer abrufen, indem Sie die Methode toString() aufrufen.

+1

In den meisten Fällen können Sie stattdessen StringBuilder verwenden. Es hat eine bessere Leistung. Es ist nicht Thread-sicher, aber die meiste Zeit ist das in Ordnung. –

+0

Es ist nicht erforderlich, einen StringBuilder/Buffer zu verwenden, es sei denn, es wird in einer Schleife angehängt. Der Compiler generiert den gleichen Bytecode für new StringBuilder(). Append ("hallo"). Append (value1) .toString() wie für "hallo" + value1; Sie können dies überprüfen, indem Sie Ihre Klassendatei mit dem Befehl javap dekompilieren. – dnault

0

Das Problem ist nicht, ob dies ein eleganter Weg ist oder nicht. Die Idee hinter der Verwendung eines Vorlagensystems könnte darin bestehen, dass Sie Ihre Vorlage in eine normale Textdatei schreiben und Java-Code nicht ändern müssen, wenn Sie Ihre Nachricht ändern (oder über i18ln nachdenken).

+1

Dies ist ein Kommentar zu einer Antwort, keine Antwort –

3

Rythm eine jetzt Java freigegeben Template-Engine mit einer neuen Funktion namens String interpolation mode, die Sie mögen etwas tun können:

String result = Rythm.render("Hello @who!", "world"); 

Der obige Fall zeigt können Sie Argument Vorlage von Position übergeben. Rythm können Sie auch Argumente mit Namen weitergeben müssen:

Map<String, Object> args = new HashMap<String, Object>(); 
args.put("title", "Mr."); 
args.put("name", "John"); 
String result = Rythm.render("Hello @title @name", args); 

Links:

Verwandte Themen