Ho messo insieme una piccola implementazione di prova di questo. L'idea di base è chiamare format
e passare la stringa di formato, una mappa di oggetti e i nomi che hanno localmente.
L'output di quanto segue è:
Il mio cane si chiama fido e Jane Doe lo possiede.
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));
}
}
Nota: non viene compilato a causa di eccezioni non gestite. Ma rende il codice molto più facile da leggere.
Inoltre, non mi piace che tu debba costruire la mappa da solo nel codice, ma non so come ottenere i nomi delle variabili locali in modo programmatico. Il modo migliore per farlo è ricordarsi di mettere l'oggetto nella mappa non appena lo si crea.
L'esempio seguente produce i risultati desiderati dal tuo esempio:
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));
}
Dovrei anche dire che non ho idea di cosa sia Velocity, quindi spero che questa risposta sia pertinente.
String.format("Hello %s", username);