需在單個 Map 中存儲多種類型的值:boolean、Currency 對象、String 等,鍵均為 String。
Map<String, Object> map = new HashMap<>();
map.put("kProfileSetupDone", initialSetupDone); // boolean → 自動裝箱 Boolean
map.put("kDefaultCurrency", defaultCurrency); // Currency 對象
map.put("kUserId", userId); // String
// 取值時需類型轉換
boolean setupDone = (Boolean) map.get("kProfileSetupDone");
Currency currency = (Currency) map.get("kDefaultCurrency");
String userId = (String) map.get("kUserId");
Object:Java 泛型不支持多態值類型,Object 是所有類的公共父類,可承載任意引用類型及裝箱後的基本類型。put("key", true) 實際存入 Boolean.TRUE;取出時 (Boolean) map.get("key") 再拆箱為 boolean。
public class ProfileData {
private final Map<String, Object> data = new HashMap<>();
public void setSetupDone(boolean done) {
data.put("kProfileSetupDone", done);
}
public boolean isSetupDone() {
Object val = data.get("kProfileSetupDone");
return val instanceof Boolean && (Boolean) val;
}
public void setDefaultCurrency(Currency currency) {
data.put("kDefaultCurrency", currency);
}
public Currency getDefaultCurrency() {
return (Currency) data.get("kDefaultCurrency");
}
// ... 其他類型安全 Getter/Setter
}
| 方案 | 優點 | 缺點 |
|---|---|---|
| Map<String, Object> | 簡單、靈活、標準 API | 需手動轉型、無編譯期類型安全 |
| 自定義類 (POJO) | 類型安全、IDE 支持、自文檔化 | 結構固定、擴展需修改代碼 |
| JSONObject / Bundle | 內建序列化、跨進程傳遞 | 性能稍低、類型轉換同樣需手動 |
臨時、動態、結構不固定的異構數據用 Map<String, Object>;固定業務模型優先定義 POJO 類,利用編譯器保障類型安全。兩者可共存:POJO 內部用 Map 存儲擴展屬性。