Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举包装器中的类型安全性_Java_Android - Fatal编程技术网

Java 枚举包装器中的类型安全性

Java 枚举包装器中的类型安全性,java,android,Java,Android,背景资料: 有时,你需要在你的android应用程序中共享几个全局首选项,其中一个选项是使用SharedReferences来实现这一点 //get the preferences SharedPreferences prefs = myActivity().getSharedPreferences(“ConfigurationStore”, Context.MODE_PRIVATE); //store a value prefs.edit().putString(“user”, “Ted

背景资料:

有时,你需要在你的android应用程序中共享几个全局首选项,其中一个选项是使用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();

不,这种设计不行

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

public PrefHandler<T> {
    T get();
    void set(T);
}
公共预处理程序{
T get();
无效集(T);
}
并具有此接口的多个实例:

public class ConfigurationStore {
    public static final PrefHandler<String> FOO = ...;
    public static final PrefHandler<Integer> BAR = ...;
}
公共类配置存储{
公共静态最终预处理程序FOO=。。。;
公共静态最终预处理程序条=。。。;
}

不,不适合这种设计

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

public PrefHandler<T> {
    T get();
    void set(T);
}
公共预处理程序{
T get();
无效集(T);
}
并具有此接口的多个实例:

public class ConfigurationStore {
    public static final PrefHandler<String> FOO = ...;
    public static final PrefHandler<Integer> BAR = ...;
}
公共类配置存储{
公共静态最终预处理程序FOO=。。。;
公共静态最终预处理程序条=。。。;
}

enum应该是一组常量。另一方面,您似乎将它们用作变量,但使用名称空间。那么简单类有什么错呢?它很容易在任何地方访问表单,不需要传递表单。使用枚举作为实现单例模式的方法。枚举应该是一组常量。另一方面,您似乎将它们用作变量,但使用名称空间。那么简单类有什么错呢?它很容易在任何地方访问表单,不需要传递表单。使用枚举作为实现单例模式的方法。