2016-07-23 28 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

相關問題