我是否需要将资源包转换为地图才能访问这些值,还是可以直接使用资源包?

Do I need to convert a resource bundle to a map to access the values or can I directly use the bundle?

不太熟悉Java,我可能做了一些多余或不必要的事情。我得到一个 ResourceBundle,然后希望将其转换为 Map,然后使用地图中的值。

这就是我想要做的...

    try {
        bundle = ResourceBundle.getBundle("filename");
    } catch (MissingResourceException e) {
        ...
        
    } catch (Exception e) {
        ...
    }
    Map<String, String> map = convertResourceBundleToMap (bundle);
    
    // Then else where in the code, to get a value, I do
    map.get(key);

ResourceBundle转换为Map的方法:

    private static Map<String, String> convertResourceBundleToMap(ResourceBundle resource) {
        Map<String, String> map = new HashMap<>();
    
        Enumeration<String> keys = resource.getKeys();

        while (keys.hasMoreElements()) {
            String key = keys.nextElement();
            String value = resource.getString(key);
            map.put(key, value);
        
        }
        return map;
    }

使用

直接从 ResourceBundle 获取值有缺点吗
resource.getString(key);

打电话?

另外,如果是在多线程环境中,如何做到这一点?

除非你有一些奇特的用例,否则你可以而且应该直接使用 ResourceBundle 方法,原因如下:

  1. ResourceBundle 专门设计用于这种方式。还有其他可用的方法,例如 getStringArray()。如果将其转换为普通地图,您将丢失一些 ResourceBundle 信息。

  2. ResourceBundle 有额外的父子逻辑(如 Properties)。它解决了默认问题,当不是所有的字符串都被翻译成每个语言环境时。当转换为地图时,这种父子关系将被反规范化。

  3. 转换为地图是一种额外的性能和内存开销,不会带来任何显着的好处。

  4. ResourceBundle 是线程安全的。默认方法实现是线程安全的,class 契约要求所有子classes 是线程安全的。


我可以考虑将 ResourceBundle 转换为映射,仅用于一些不寻常的用例,例如将字符串序列化为 JSON,或以某种方式转换 keys/values。