Saya mengumpulkan implementasi tes kecil ini. Ide dasarnya adalah memanggil format
dan meneruskan dalam format string, dan peta objek, dan nama yang mereka miliki secara lokal.
Output dari berikut ini adalah:
Anjing saya bernama fido, dan Jane Doe adalah pemiliknya.
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));
}
}
Catatan: Ini tidak dapat dikompilasi karena pengecualian yang tidak tertangani. Tapi itu membuat kode lebih mudah dibaca.
Selain itu, saya tidak suka Anda harus membuat sendiri peta dalam kode, tetapi saya tidak tahu cara mendapatkan nama variabel lokal secara terprogram. Cara terbaik untuk melakukannya, adalah dengan mengingat untuk meletakkan objek di peta segera setelah Anda membuatnya.
Contoh berikut menghasilkan hasil yang Anda inginkan dari contoh Anda:
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));
}
Saya juga harus menyebutkan bahwa saya tidak tahu apa itu Velocity, jadi saya harap jawaban ini relevan.
String.format("Hello %s", username);