ฉันได้รวบรวมการทดสอบเล็ก ๆ น้อย ๆ ของสิ่งนี้ แนวคิดพื้นฐานคือการเรียกformat
และส่งผ่านในสตริงรูปแบบและแผนที่ของวัตถุและชื่อที่มีในเครื่อง
ผลลัพธ์ต่อไปนี้คือ:
สุนัขของฉันชื่อ fido และ Jane Doe เป็นเจ้าของเขา
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));
}
ฉันควรพูดถึงว่าฉันไม่รู้ว่า Velocity คืออะไรดังนั้นฉันหวังว่าคำตอบนี้จะเกี่ยวข้อง
String.format("Hello %s", username);