考虑一下这样一个事实:您有一个从中获取数据的 API,并且该 API 本身会返回某些 key ,接收客户端应使用这些 key 来“解析”要向用户呈现哪个人类可读的字符串。
例如,按键可能如下所示:
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)在包含所有数据(字符串、整数)的单例类中的某个位置有一个静态查找字段,但考虑到有很多键需要跟踪,这可能是一个不幸的内存打击吗?
Map<String, Integer> strings = new HashMap<String, Integer>() {{
put("DOMAIN_TYPE_SUBTYPE_ID", R.string.domain_type_subtype_id);
//...
}};
🤔
关于如何以良好的方式解决问题有什么建议吗?
最佳答案
感觉真的很脆弱,我会避免它
我会做类似的事情,但用 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 与 Switch 的比较取决于内存与性能,您可以在 map 中进行更快的查找,但会消耗内存。
关于java - 将 key 从服务器映射到资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154964/