通用的Enum.valueOf

时间:2015-11-06 17:49:47

标签: java android generics enums

我试图将Enums保存为首选项。

要保存枚举,我可以使用:

public static <T extends Enum<T>> void savePreference(final Context context, final String id, final T value) {
    SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(id, value.name());
    editor.apply();
}

我试图在下面做一些事情,这样我就可以将偏好读入一个通用的枚举:

public static <T extends Enum<T>> T getPreference(final Context context, final String id, final T defaultValue) {
    try {
        SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
        String name = settings.getString(id, null);
        return name != null ? Enum.valueOf(T, name) : defaultValue;
    } catch (Exception e) {
        Log.e("ERROR GETTING", e.toString());
        return defaultValue;
    }
}

但这给了我错误:

Error:(93, 48) error: cannot find symbol variable T

on&#34; Enum.valueOf(T,name)&#34;表达

我也尝试使用T.valueOf(name),但会产生参数不匹配错误。

我已经能够通过不使用泛型和编码特定的实现来解决它,但这种方法失败了:

public static Constants.ButtonLocations getPreference(final Context context, final String id, final Constants.ButtonLocations defaultValue) {
    try {
        SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
        String name = settings.getString(id, null);
        return name != null ? Constants.ButtonLocations.valueOf(name) : defaultValue;
    } catch (Exception e) {
        Log.e("ERROR GETTING", e.toString());
        return defaultValue;
    }
}

如何创建getPreference的通用版本?

1 个答案:

答案 0 :(得分:6)

您可以在方法中添加Class<T>参数

public static <T extends Enum<T>> T getPreference(final Context context, final String id, final Class<T> clazz, final T defaultValue)

然后你可以使用

Enum.valueOf(clazz, name)

或者,如果defaultValue永远不会是null,您可以摆脱这个额外参数并使用此默认值来获取该类。

Enum.valueOf(defaultValue.getDeclaringClass(), name)