在枚举包装中键入安全性

时间:2013-10-23 10:27:24

标签: java android

背景资料:

有时您需要在Android应用程序中共享几个全局首选项,一个选项是使用SharedPreferences来完成此任务;

//get the preferences

SharedPreferences prefs = myActivity().getSharedPreferences(“ConfigurationStore”, Context.MODE_PRIVATE);

//store a value

prefs.edit().putString(“user”, “Teddy”).commit();

//get the value

prefs.getString(“user”, null); 

我喜欢我的代码简单,所以我写了一个包装器来隐藏上面的内容,这是结果。

public enum ConfigurationStore {
  USER(“user”);
  private String key;
  private SharedPreferences prefs = //get this from your activity class
  ConfigurationStore(String key){
    this.key = key;
  }
  public String get(){
    return prefs.getString(key, null);
  }
  public void set(String value){
    prefs.edit().putString(key, value).commit();
  }

}

包装器的用法如下所示

//Set a value:
ConfigurationStore.USER.set("Teddy");
//get a value
ConfigurationStore.USER.get()

只需添加到枚举中即可轻松扩展新属性:

public enum ConfigurationStore {
  USER(“user”),
  DEPLOYMENT_TYPE(“deployment_type”);
....
//Set a value:
ConfigurationStore.DEPLOYMENT_TYPE.set("Beta-test");
//get a value
ConfigurationStore.DEPLOYMENT_TYPE.get()

问题:

enum严格处理String属性。 有没有办法可以让这个枚举安全地处理不同的类型而不添加其他方法签名(getStringValue,getIntValue)?

我希望能够做到这样的事情:

int age = 23;
String name = "Teddy"
ConfigurattionStore.AGE.set(age)
ConfigurattionStore.NAME.set(name)
...
age = ConfigurattionStore.AGE.get();
name = ConfigurattionStore.NAME.get();

1 个答案:

答案 0 :(得分:1)

不,不是这个设计。

为了能够做你想做的事,你需要定义一个通用接口或类

public PrefHandler<T> {
    T get();
    void set(T);
}

并且有这个界面的多个实例:

public class ConfigurationStore {
    public static final PrefHandler<String> FOO = ...;
    public static final PrefHandler<Integer> BAR = ...;
}