将键从服务器映射到资源

Map keys from the server to resources

考虑这样一个事实,即您有一个 API 从中获取数据,并且 API 本身 returns 接收客户端应该使用的某些键 "resolve" 要呈现给用户的人类可读字符串。

例如,键可能看起来像这样:

DOMAIN_TYPE_SUBTYPE_ID

然后将对应于 strings.xml 中的给定条目:

<string name="domain_type_subtype_id">This magical item</string>

不幸的是,人类可读的值本身不是从 API 传递的(也不需要翻译),但我正在尝试找出关于如何映射的最佳方法以最有效的方式获取值 (R.string.abc) 的键。

在我的脑海中,我看到了两种前进的方式(因为我无法更改 API):

1) 根据名称进行运行时资源查找,并向所有代码大神祈祷事情不会改变。基本上:

Resources.getSystem().getIdentifier(keyFromTheApi.toLowerCase(), "id", getPackageName())

但是,根据我所听到和阅读的内容...这确实不是一种高效的方法。我认为在多个字符串的 RecyclerView 设置中使用它是一个非常糟糕的主意。

2) 在单例 class 的某处有一个包含所有数据(字符串、整数)的静态查找字段,但考虑到 很多 要跟踪的键,这可能是不幸的内存命中?

Map<String, Integer> strings = new HashMap<String, Integer>() {{
    put("DOMAIN_TYPE_SUBTYPE_ID", R.string.domain_type_subtype_id);
    //...
}};

关于如何以好的方式解决问题有什么建议吗?

  1. 感觉真的很脆弱,我会避免它

  2. 我会做类似的事情,但用 switch 语句代替:

    public static int lookupStringRes(String value) {
      switch (value) {
          case "DOMAIN_TYPE_SUBTYPE_ID": return R.string.domain_type_subtype_id;
    
          // ...
    
          default:
              Log.w("TAG", "Resource not found");
              return -1;
      }
    }
    

并不是说这是最好的解决方案,但在我的脑海中,这是我要开始的解决方案。 Map vs Switch 归结为内存 vs 性能,您将以内存为代价在 Map 中进行更快的查找。