3

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

第二种解决方案是将捆绑包分成许多,但我最终会得到捆绑包只有 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并获取值,但是由于捆绑包是与类本身同时初始化的......程序很可能没有时间从喜好。

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

谢谢

4

2 回答 2

4

如果您打算只为默认语言环境提供消息,那么您所拥有的就可以了。

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

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使用 a Mapof Maps 以 property=value 格式加载键的翻译,不仅来自文件,还来自数据库。我错误地认为我们在那个解决方案中Map有一个。ResourceBundle源示例现在已修复。

于 2013-07-31T18:20:56.713 回答
0

您可以创建一个单例类:

public class MyResouceBundle extends ResourceBundle {

    private static MyResourceBundle instance = new MyResouceBundle();

    // private constructor, no one can instantiate this class, only itself
    private MyResourceBundle() {

    }

    public ResourceBundle getInstance() {
        return instance;
    }
}

然后,每个人都将访问该类的同一个实例(例如,获取 KEY_A 的字符串):

MyResourceBunde.getInstance().get("KEY_A");
于 2013-07-31T18:11:11.830 回答