Chúng tôi có rất nhiều chuỗi chứa cùng một chuỗi con, từ các câu về kiểm tra nhật ký hoặc cách liên hệ với bộ phận hỗ trợ, đến các chuỗi giống như thương hiệu có chứa tên công ty hoặc sản phẩm. Sự lặp lại đã gây ra một vài vấn đề cho chính mình (chủ yếu là lỗi chính tả hoặc sao chép/dán lỗi) nhưng nó cũng gây ra các vấn đề ở chỗ nó làm tăng số lượng văn bản dịch giả của chúng tôi phải dịch.Làm thế nào để tránh lặp lại trong chuỗi Java ResourceBundle?
Các giải pháp tôi đã đưa ra đi một cái gì đó như thế này:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
đại biểu đến bó tài nguyên thật nhưng thực hiện chuyển đổi của {{this.kind.of.thing}} để tìm kiếm chìa khóa trong các nguồn tài nguyên.
Mỗi khi bạn muốn để có được một trong số này, bạn phải đi:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
Và điều này hoạt động tốt - một thời gian.
Điều cuối cùng xảy ra là một số mã mới (trong trường hợp mã được tạo tự động của chúng tôi được nhổ ra khỏi Matisse) tra cứu cùng một gói tài nguyên mà không chỉ định điều khiển tùy chỉnh. Điều này dường như không thể tái sản xuất nếu bạn viết một bài kiểm tra đơn vị đơn giản gọi nó với và sau đó không có, nhưng nó xảy ra khi ứng dụng được chạy cho thực. Bằng cách nào đó bộ nhớ cache bên trong ResourceBundle
đẩy giá trị tốt và thay thế nó bằng giá trị bị hỏng. Tôi chưa tìm ra lý do tại sao và các tập tin jar của Sun được biên dịch mà không cần thông tin gỡ lỗi để gỡ lỗi nó là một việc vặt.
Câu hỏi của tôi:
Có một số cách để thiết lập trên toàn cầu các ResourceBundle.Control mặc định rằng tôi có thể không biết? Điều đó sẽ giải quyết mọi thứ khá thanh lịch.
Có cách nào khác để xử lý loại điều này một cách thanh lịch, có lẽ không làm xáo trộn các lớp ResourceBundle?
Đó là thứ có thể dễ dàng được xử lý bằng cách sử dụng lập trình meta, nếu Java có. –