将密钥从服务器映射到资源

时间:2017-11-07 10:01:59

标签: java android android-resources

考虑一下这样一个事实,即您拥有一个可以从中获取数据的API,并且API本身会返回接收客户端应该使用的某些密钥来解析"哪个人类可读的字符串呈现给用户。

例如,键可能如下所示:

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)在一个包含所有数据(String,Integer)的单例类中的某个地方有一个静态查找字段,但考虑到有很多的键来跟踪,可能是一个不幸的记忆?

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

有关如何以良好方式解决问题的任何建议?

1 个答案:

答案 0 :(得分:1)

  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;
      }
    }
    
  3. 不是说这是最好的解决方案,但我不知道这是我开始的解决方案。 Map vs Switch类似于内存与性能的关系,你可以在地图上以更快的速度查找内存。