मैंने इसके एक छोटे परीक्षण कार्यान्वयन को एक साथ फेंक दिया। मूल विचार format
प्रारूप स्ट्रिंग, और वस्तुओं का एक नक्शा, और उन नामों को कॉल और पास करना है जो उनके पास स्थानीय स्तर पर हैं।
निम्नलिखित का आउटपुट है:
मेरे कुत्ते का नाम फिदो है, और जेन डो उसका मालिक है।
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));
}
}
नोट: यह बिना किसी अपवाद के संकलन नहीं है। लेकिन यह कोड को पढ़ने में बहुत आसान बनाता है।
इसके अलावा, मुझे यह पसंद नहीं है कि आपको कोड में खुद ही नक्शे का निर्माण करना होगा, लेकिन मुझे नहीं पता कि स्थानीय रूप से स्थानीय चर के नाम कैसे प्राप्त करें। इसे करने का सबसे अच्छा तरीका यह है कि जैसे ही आप इसे बनाएं, ऑब्जेक्ट को मैप में रखना याद रखें।
निम्न उदाहरण उन परिणामों का उत्पादन करता है जो आप अपने उदाहरण से चाहते हैं:
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));
}
मुझे यह भी उल्लेख करना चाहिए कि मुझे पता नहीं है कि वेग क्या है, इसलिए मुझे आशा है कि यह उत्तर प्रासंगिक है।
String.format("Hello %s", username);