J'ai jeté ensemble un petit test de mise en œuvre de cela. L'idée de base est d'appeler format
et de transmettre la chaîne de format, une carte des objets et les noms qu'ils ont localement.
Le résultat de ce qui suit est:
Mon chien s'appelle fido et Jane Doe le possède.
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));
}
}
Remarque: cela ne compile pas en raison d'exceptions non gérées. Mais cela rend le code beaucoup plus facile à lire.
De plus, je n'aime pas que vous deviez construire la carte vous-même dans le code, mais je ne sais pas comment obtenir les noms des variables locales par programme. La meilleure façon de le faire est de ne pas oublier de mettre l'objet dans la carte dès que vous le créez.
L'exemple suivant produit les résultats souhaités à partir de votre exemple:
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));
}
Je devrais également mentionner que je n'ai aucune idée de ce qu'est Velocity, donc j'espère que cette réponse est pertinente.
String.format("Hello %s", username);