我正在尝试构建一个可以处理不同设置类型的DAO。我想知道是否有一种巧妙的方法可以做到这一点而不会出现运行时错误。
public interface ChannelSettingDAO {
Integer getIntegerSetting(ChannelSettingInteger channelSettingInteger);
String getStringSetting(ChannelSettingString channelSettingString);
Double getDoubleSetting(ChannelSettingDouble channelSettingDouble);
void setIntegerSetting(ChannelSettingInteger channelSettingInteger, Integer value);
void setStringSetting(ChannelSettingString channelSettingString, String value);
void setDoubleSetting(ChannelSettingDouble channelSettingDouble, Double value);
}
public enum ChannelSettingInteger {
CHANNEL_LOOKBACK(50);
private Integer defaultValue;
ChannelSettingInteger(Integer defaultValue) {
this.defaultValue = defaultValue;
}
public Integer getDefaultValue() {
return defaultValue;
}
}
etc.. for every type of enum.
有没有更简洁的方法来做到这一点。我觉得我错过了一些东西,某种方式可能会给类型一个枚举,或者某些我错过的模式。
至少一种强制getDefault名称相同的方法。
任何提示?
答案 0 :(得分:1)
有没有更简洁的方法来做到这一点。我觉得我错过了一些东西,某种方式可以给类型一个枚举,或者我错过了一些模式。 至少一种强制getDefault名称相同的方法。
您是对的,您可以使用其他设计来更好地满足您的需求
您可以引入一个接口,每个枚举必须实现该接口才能使用getDefault()
方法。通过这种方式,您可以确保每个枚举具有相同的基本类型(接口中的哪一个),并且在接口中声明后提供getDefault()
。
通过在接口上使用泛型类型,您允许每个枚举拥有自己的getDefaultValue
示例代码:
public interface IChannelSetting<T> {
public T getDefaultValue();
}
public enum ChannelSettingInteger implements IChannelSetting<Integer> {
CHANNEL_LOOKBACK(50);
private Integer defaultValue;
ChannelSettingInteger(Integer defaultValue) {
this.defaultValue = defaultValue;
}
@Override
public Integer getDefaultValue() {
return defaultValue;
}
}
我不知道你将如何使用你的DAO,但只是为了你的个人信息,如果你的需要相关,你可以通过利用公共基础接口来进一步利用对称逻辑和更少的代码DAO。
实际上,您可以在DAO中声明两个通用方法,例如:
public interface ChannelSettingDAO {
<T> T getSetting(IChannelSetting<T> channelSetting);
<T> void setSetting(IChannelSetting<T> channelSetting, T value);
}