2013-10-23 44 views
1

背景信息:枚舉包裝類型安全

有時你需要分享一些全球性的偏好在你的Android應用程序,一個選擇是使用SharedPreferences做到這一點;

//get the preferences 

SharedPreferences prefs = myActivity().getSharedPreferences(「ConfigurationStore」, Context.MODE_PRIVATE); 

//store a value 

prefs.edit().putString(「user」, 「Teddy」).commit(); 

//get the value 

prefs.getString(「user」, null); 

我喜歡我的代碼簡單,所以我寫了一個包裝來隱藏上面,這裏是結果。

public enum ConfigurationStore { 
    USER(「user」); 
    private String key; 
    private SharedPreferences prefs = //get this from your activity class 
    ConfigurationStore(String key){ 
    this.key = key; 
    } 
    public String get(){ 
    return prefs.getString(key, null); 
    } 
    public void set(String value){ 
    prefs.edit().putString(key, value).commit(); 
    } 

} 

包裝的使用如下所示

//Set a value: 
ConfigurationStore.USER.set("Teddy"); 
//get a value 
ConfigurationStore.USER.get() 

可以很容易地用新的特性剛好延伸通過向枚舉:

public enum ConfigurationStore { 
    USER(「user」), 
    DEPLOYMENT_TYPE(「deployment_type」); 
.... 
//Set a value: 
ConfigurationStore.DEPLOYMENT_TYPE.set("Beta-test"); 
//get a value 
ConfigurationStore.DEPLOYMENT_TYPE.get() 

問題:

枚舉嚴格處理字符串屬性。 有沒有辦法讓這個枚舉可以安全地處理不同的類型而無需添加其他方法簽名(getStringValue,getIntValue)?

我希望能夠做一些事情,如:

int age = 23; 
String name = "Teddy" 
ConfigurattionStore.AGE.set(age) 
ConfigurattionStore.NAME.set(name) 
... 
age = ConfigurattionStore.AGE.get(); 
name = ConfigurattionStore.NAME.get(); 
+0

枚舉應該是一個一組常量。另一方面,你似乎將它們用作變量,但是使用名稱空間。然後簡單的類有什麼問題? –

+0

隨時隨地訪問表格很容易,無需傳遞。使用枚舉作爲實現單例模式的一種方式。 – daljian

回答

1

不,不是這樣的設計。

爲了能夠做你想做的,你需要定義一個通用的接口或類

public PrefHandler<T> { 
    T get(); 
    void set(T); 
} 

而且有這個接口的多個實例:

public class ConfigurationStore { 
    public static final PrefHandler<String> FOO = ...; 
    public static final PrefHandler<Integer> BAR = ...; 
}