我正在使用像这样的方法
private static <T> void setPreference(String key, T value)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Controller.getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putString(key, value.toString());
editor.commit();
}
不幸的是,putString
是多种put方法之一。我还想使用putBoolean
和putInt
。我的问题是我想支持特定类型(我不想像我一样将所有内容保存为字符串),并且我希望尽可能减少代码重复。我已经习惯了C#,这种事情非常简单,所以我觉得我错过了一些明显的东西。
答案 0 :(得分:4)
您可以使用if (value instanceof Boolean) { editor.putBoolean(..); }
。
但那不是OO。你可以做的是将责任转移到价值对象:
public intarface ValueHolder<T> {
void putInEditor(String key, Editor editor);
T getValue();
}
public class StringValueHolder extends ValueHolder<String> {
private String value;
// constructor here to initialize the value
public putInEditor(String key, Editor editor) {
editor.putString(key, value);
}
public String getValue() {
return value;
}
}
public class BooleanValueHolder extends ValueHolder<Boolean> {
private Boolean value;
// constructor here to initialize the value
public putInEditor(String key, Editor editor) {
editor.putBoolean(key, value);
}
public Boolean getValue() {
return value;
}
}
更加冗长,我同意,所以如果您不想让事情复杂化,请坚持使用instanceof
解决方案。
答案 1 :(得分:4)
为您想要创建的每种特定类型制作几个重载:一个接受<T extends Boolean>
等的重载。