我正在为用户偏好创建一个商店,并且用户可以设置固定数量的偏好值。首选项(设置)的名称存储为枚举:
public enum UserSettingName {
FOO,
BAR,
ETC
}
我想要做的是存储带有名称的值类型,以便服务将使用正确的 Java 类型存储用户的值。例如, FOO 可能是Long
,而 BAR 可能是String
。到目前为止,我们将所有值存储为String
s,然后手动将值转换为适当的 Java 类型。这导致到处都有 try/catch 块,而在服务中只有一个 try/catch 更有意义。我知道枚举不能有泛型类型,所以我一直在玩:
public enum UserSettingName {
FOO(Long.class),
BAR(String.class),
ETC(Baz.class)
private Class type;
private UserSettingName(Class type) {
this.type = type;
}
public Class getType() {
return this.type;
}
}
我有一个通用的 UserSetting 对象,它具有应该返回并设置正确类型的值的方法public T getSettingValue()
。public void setSettingValue(T value)
我的问题来自于T
在创建或检索设置时尝试指定该泛型类型,因为我无法执行以下操作:
new UserSetting<UserSettingName.FOO.getType()>(UserSettingName.FOO, 123L)
抱歉,如果这不是很清楚,如果不理解,我可以尝试澄清。
谢谢!
更新
设置名称和值都来自 Spring MVC REST 调用:
public ResponseEntity<String> save(@PathVariable Long userId, @PathVariable UserSettingName settingName, @RequestBody String settingValue)
所以我使用了 Enum,因为 Spring 会自动转换传入的数据。