【问题标题】:Do I need to convert a resource bundle to a map to access the values or can I directly use the bundle?我是否需要将资源包转换为地图才能访问这些值,还是可以直接使用资源包?
【发布时间】:2021-05-07 15:31:21
【问题描述】:

对 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);

打电话?

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

【问题讨论】:

  • 来自文档:'...直接已知的具体子类 ListResourceBundle 和 PropertyResourceBundle 是线程安全的。'
  • 转换为地图的一大缺点是您失去了 ResourceBundle 提供的所有国际化功能。 ResourceBundle 允许为不同的语言环境定义资源,并且它已经为用户当前的语言环境加载了适当的资源。您会因地图转换而失去所有这些功能。
  • @OHGODSPIDERS 我实际上更多地将它用作属性文件,而不是用于语言环境。直接从 ResourceBundle 获取值有缺点吗?

标签: java internationalization


【解决方案1】:

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

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2017-10-30
    • 2019-03-16
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多