Ben*_*rch 6 java generics enums
我正在为用户首选项创建商店,并且用户可以为其设置固定数量的首选项.首选项(设置)的名称存储为枚举:
public enum UserSettingName {
FOO,
BAR,
ETC
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是存储一个带有名称的值类型,以便服务将使用正确的Java类型存储用户的值.例如,FOO可能是a Long
,而BAR可能是a String
.到目前为止,我们将所有值存储为String
s,然后手动将值转换为适当的Java类型.当在服务中只有一次try/catch更有意义时,这会导致try/catch块无处不在.我知道Enums不能有通用类型,所以我一直在玩:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个通用的UserSetting对象,它有public T getSettingValue()
和public void setSettingValue(T value)
应该返回的方法,并使用正确的类型设置值.我的问题来自于T
在创建或检索设置时尝试指定泛型类型,因为我无法执行以下操作:
new UserSetting<UserSettingName.FOO.getType()>(UserSettingName.FOO, 123L)
Run Code Online (Sandbox Code Playgroud)
对不起,如果不是很清楚,我可以尝试澄清它是否被理解.
谢谢!
UPDATE
设置名称和值都来自Spring MVC REST调用:
public ResponseEntity<String> save(@PathVariable Long userId, @PathVariable UserSettingName settingName, @RequestBody String settingValue)
Run Code Online (Sandbox Code Playgroud)
所以我使用了Enum,因为Spring会自动转换传入的数据.
看看netty是怎么做的:
http://netty.io/wiki/new-and-noteworthy.html#type-safe-channeloption
他们通过使用类型常量来做到这一点:
编辑:
public interface ChannelConfig {
...
<T> boolean setOption(ChannelOption<T> option, T value);
...
}
public class ChannelOption<T> ...
public static final ChannelOption<Integer> SO_TIMEOUT =
new ChannelOption<Integer>("SO_TIMEOUT");
...
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:您可以将其转换为:
class Baz {}
class UserSettingName<T> {
public static final UserSettingName<Baz> ETC = new UserSettingName<Baz>();
}
class UserSetting {
public <T> UserSetting(UserSettingName<T> name, T param) {
}
}
public class Test {
public static void main(String[] args) {
new UserSetting(UserSettingName.ETC, new Baz());
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3421 次 |
最近记录: |