Tôi đã cùng nhau thực hiện một thử nghiệm nhỏ về điều này. Ý tưởng cơ bản là gọi format
và chuyển vào chuỗi định dạng, bản đồ các đối tượng và tên mà chúng có cục bộ.
Kết quả sau đây là:
Con chó của tôi tên là fido, và Jane Doe sở hữu nó.
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));
}
}
Lưu ý: Điều này không biên dịch do các ngoại lệ không được xử lý. Nhưng nó làm cho mã dễ đọc hơn nhiều.
Ngoài ra, tôi không thích việc bạn phải tự xây dựng bản đồ trong mã, nhưng tôi không biết cách lấy tên của các biến cục bộ theo chương trình. Cách tốt nhất để làm điều đó, là nhớ đưa đối tượng vào bản đồ ngay khi bạn tạo nó.
Ví dụ sau tạo ra kết quả mà bạn muốn từ ví dụ của mình:
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));
}
Tôi cũng nên đề cập rằng tôi không biết Vận tốc là gì, vì vậy tôi hy vọng câu trả lời này có liên quan.
String.format("Hello %s", username);