Ich habe eine kleine Testimplementierung davon zusammengestellt. Die Grundidee besteht darin, format
die Formatzeichenfolge sowie eine Karte der Objekte und die Namen, die sie lokal haben , aufzurufen und zu übergeben.
Die Ausgabe der folgenden ist:
Mein Hund heißt Fido und Jane Doe besitzt ihn.
public class StringFormatter {
private static final String fieldStart = "\\$\\{";
private static final String fieldEnd = "\\}";
private static final String regex = fieldStart + "([^}]+)" + fieldEnd;
private static final Pattern pattern = Pattern.compile(regex);
public static String format(String format, Map<String, Object> objects) {
Matcher m = pattern.matcher(format);
String result = format;
while (m.find()) {
String[] found = m.group(1).split("\\.");
Object o = objects.get(found[0]);
Field f = o.getClass().getField(found[1]);
String newVal = f.get(o).toString();
result = result.replaceFirst(regex, newVal);
}
return result;
}
static class Dog {
public String name;
public String owner;
public String gender;
}
public static void main(String[] args) {
Dog d = new Dog();
d.name = "fido";
d.owner = "Jane Doe";
d.gender = "him";
Map<String, Object> map = new HashMap<String, Object>();
map.put("d", d);
System.out.println(
StringFormatter.format(
"My dog is named ${d.name}, and ${d.owner} owns ${d.gender}.",
map));
}
}
Hinweis: Dies wird aufgrund nicht behandelter Ausnahmen nicht kompiliert. Aber es macht den Code viel einfacher zu lesen.
Ich mag es auch nicht, dass Sie die Map selbst im Code erstellen müssen, aber ich weiß nicht, wie ich die Namen der lokalen Variablen programmgesteuert abrufen kann. Der beste Weg, dies zu tun, besteht darin, daran zu denken, das Objekt in die Karte einzufügen, sobald Sie es erstellen.
Das folgende Beispiel erzeugt die gewünschten Ergebnisse aus Ihrem Beispiel:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
Site site = new Site();
map.put("site", site);
site.name = "StackOverflow.com";
User user = new User();
map.put("user", user);
user.name = "jjnguy";
System.out.println(
format("Hello ${user.name},\n\tWelcome to ${site.name}. ", map));
}
Ich sollte auch erwähnen, dass ich keine Ahnung habe, was Geschwindigkeit ist, also hoffe ich, dass diese Antwort relevant ist.
String.format("Hello %s", username);