Bunun küçük bir test uygulamasını bir araya getirdim. Temel fikir, format
biçim dizesini ve nesnelerin bir haritasını ve yerel olarak sahip oldukları isimleri çağırmak ve iletmektir.
Aşağıdakilerin çıktısı:
Köpeğimin adı fido ve Jane Doe onun sahibi.
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));
}
}
Not: Bu, işlenmemiş istisnalar nedeniyle derlenmez. Ancak kodu okumayı çok daha kolay hale getirir.
Ayrıca, haritayı kodda kendiniz oluşturmanızdan hoşlanmıyorum, ancak yerel değişkenlerin adlarını programatik olarak nasıl alacağımı bilmiyorum. Bunu yapmanın en iyi yolu, nesneyi yaratır yaratmaz haritaya koymayı hatırlamaktır.
Aşağıdaki örnek, örneğinizden istediğiniz sonuçları üretir:
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));
}
Ayrıca, Hızın ne olduğu hakkında hiçbir fikrim olmadığını da belirtmeliyim, bu yüzden bu cevabın alakalı olduğunu umuyorum.
String.format("Hello %s", username);