2016-07-23 51 views
0

我试图构建一个DAO来处理不同的设置类型。我想知道是否有一个简单的方法来做到这一点,没有运行时错误的机会。Java - 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

我不能告诉你想要什么。这里需要更多的细节...... – arcy

回答

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); 
} 
+0

哇,这正是我正在寻找的,我没有意识到你可以创建一个通用的接口,并强制在'实现'部分的类型。 没有这个,我能做的最好的是: public Object getDefaultValue(); – deadfire19

+0

我想:) 其实,你并不强迫这种类型。这就像通用名单。只有在您声明要使用的泛型类型时才会强制它。 但是只要你确定了类型,那么你就创建了约束。 – davidxxx

相关问题