簡體   English   中英

枚舉包裝中的類型安全

[英]Type safety in enum wrapper

背景信息:

有時您需要在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()

問題:

枚舉嚴格地處理String屬性。 有沒有一種方法可以使此枚舉安全地處理不同類型,而無需添加其他方法簽名(getStringValue,getIntValue)?

我希望能夠執行以下操作:

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

不,不是這種設計的。

為了能夠做您想做的事,您需要定義一個通用接口或類

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

並具有此接口的多個實例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM