Tôi đã cùng nhau thực hiện thử nghiệm nhỏ. Ý tưởng cơ bản là gọi format
và chuyển vào chuỗi định dạng và bản đồ các đối tượng và tên mà chúng có tại địa phương.
Sản lượng sau đây là:
Con chó của tôi được đặt tên fido, và Jane Doe sở hữu anh ấy.
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 ý: Đây không biên dịch do ngoại lệ unhandled. Nhưng nó làm cho mã dễ đọc hơn nhiều.
Ngoài ra, tôi không thích rằng 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ớ đặt đối tượng vào bản đồ ngay sau khi bạn tạo ra nó.
Ví dụ sau đây tạo ra kết quả mà bạn muốn từ ví dụ của bạn:
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 đến mà tôi không có ý tưởng gì Velocity là, vì vậy tôi hy vọng câu trả lời này là có liên quan.
Thay thế ở đâu? Một lớp học? Một JSP? Chuỗi có một phương thức định dạng nếu bạn chỉ: 'String.format (" Hello% s ", tên người dùng);' – Droo
@Droo: Trong ví dụ, chuỗi giống như 'Hello $ {user.name}', không giống như 'Hello % s' hoặc 'Hello {0}'. –
Nếu bạn cần một cái gì đó trông giống như vận tốc và mùi giống như vận tốc, có lẽ nó là vận tốc? :) – serg