枚举包装器中的java类型安全
背景信息:
有时,你需要在安卓应用程序中共享几个全局首选项,其中一个选项是使用SharedReferences来实现这一点
//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()
问题是:
枚举严格地处理字符串属性。 有没有一种方法可以让这个枚举在不添加其他方法签名(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 楼答案
不,这种设计不行
要想做你想做的事情,你需要定义一个通用接口或类
并具有此接口的多个实例: