我目前正在为使用 ResourceBundle 的应用程序制作资源。问题是,使用当前的代码来分派(dispatch)资源,我每次需要时都需要创建一个资源包的实例,我猜这不是一个好主意,因为我最终会一次又一次地加载资源.

第二种解决方案是将捆绑包分成许多,但我最终会得到捆绑包只有 2-3 个字符串,比如 15 个捆绑包。

我的问题是:
有没有一种方法可以简单地将所有资源加载到一个静态类中并从那里访问它们。

我制作了这段似乎对我有用的小代码,但我怀疑它的质量。

public class StaticBundle
{
    private final static ResourceBundle resBundle =
        ResourceBundle.getBundle("com.resources");
    public final static String STRING_A = resBundle.getString("KEY_A");
    public final static String STRING_B = resBundle.getString("KEY_B");
    public final static String STRING_C = resBundle.getString("KEY_C");
}

有了这个,我可以调用 StaticBundle.STRING_A 并在项目中的任何地方获取值,但由于捆绑包与类本身同时初始化......程序很可能没有时间从偏好。

有没有好的方法可以做到这一点或任何其他可能的解决方案?

谢谢

最佳答案

如果您打算只为默认区域设置消息,那么您所拥有的就可以了。

或者,您可以让调用者指定它需要的键而不是常量,如下所示:

public static String getMessage(String key) {
    return resBundle.getString(key);
}

如果您喜欢支持多个语言环境,那么通常的方法是使用 Map<Locale, ResourceBundle> Map<Locale, Map<String, String> 为每个语言环境仅加载一次资源。在这种情况下,您的类将有一个方法,调用者可以在其中指定语言环境:
public static String getMessage(String key, Locale locale) {
    Map<String, String> bundle = bundles.get(locale);   // this is the map with all bundles
    if (bundle == null) {
        // load the bundle for the locale specified
        // here you would also need some logic to mark bundles that were not found so
        // to avoid continously searching bundles that are not present

        // you could even return the message for the default locale if desirable
    }
    return bundle.get(key);
}

编辑: 正如@JB Nizet(感谢)正确指出的那样,ResourceBundle 已经存储了 Map 。我在源示例中提供的自定义解决方案是关于类似于 ResourceBundle 的自定义机制,该机制使用 MapMap 以 property=value 格式加载键的翻译,不仅来自文件,还来自数据库。我错误地认为我们在该解决方案中有 MapResourceBundle。源示例现已修复。

关于java - 静态资源包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17977539/

10-16 19:37