2012-05-18 29 views
1

我正在編寫一個類,將被序列化以保存在數據庫中,並通過網絡發送一個程序。地圖與類屬性的建議

爲了使通過命令行界面訪問類屬性變得更容易,我正在考慮將屬性存儲在Map類中,而不是爲每個屬性賦予它自己的變量。

基本上,而不是使用這樣的:

String id = account.getUserId(); 

我會做這個

String id = account.properties.get("userId"); 

這是做事情的方式最好?

+1

我建議如上面做的,而是用枚舉的,而不是字符串 –

回答

2

是的,這是一個非常合理的模型。它有時被稱爲「prototype object model」,與您在JavaScript中工作的方式非常相似,其中每個對象實際上都是一個Map。這反過來導致了非常流行的JSON序列化格式。

不錯的功能:

  • 您不必擔心凌亂繼承heirarchies - 你可以隨意改變性質。
  • 您可以通過從另一個對象(原型)進行復制來創建一個新對象
  • 操作數據的代碼可以以統一的方式進行操作,而無需明確命名所有變量。
  • 它更「動態」相比靜態類定義 - 它很容易擴展和修改你的對象

潛在的風險/缺點:

  • 你需要的,如果讓你的屬性名稱的軌道你使用字符串 - 編譯器不會爲你做!這個問題可以通過使用枚舉作爲鍵來緩解,但是這樣你就失去了一些靈活性......
  • 你沒有得到靜態類型檢查的好處,所以你可能會發現你需要編寫更多的JUnit測試作爲結果確保一切是否正常工作
  • 有輕微的性能開銷(儘管可能沒有足夠的理由擔心,作爲地圖查詢的速度非常快)

我實際使用一個變種OG寫於90年代的整個遊戲這個對象模型(Tyrant),它工作得很好。

然而,您可能需要考慮封裝此功能,以便您可以在對象本身上使用訪問方法,例如,

String id = account.getProperty("userId"); 
+0

謝謝!我感覺更好地推進這一點。 –

2

如何我喜歡做這往往是這樣的:

enum StringPropertyType { 
    USERID, FIRSTNAME, LASTNAME 
} 

interface StringAttributes { 
    String get(StringPropertyType s); 
    void put(StringPropertyType s, String value); 
} 

class MapBasedStringAttributes implements StringAttributes { 
    Map<StringPropertyType, String> map = new HashMap<~>(); 
    String get(StringPropertyType s) { return map.get(s); } 
    void put(StringPropertyType s, String value) { map.put(s,value); } 
} 

這給你編譯時的安全性,重構等

,你也可以使用stringPropertyType。名稱()來獲取枚舉值的字符串表示,並使用

Map<String,String> 

,而不是..

+0

非常感謝!我只能給一個答案一個綠色支票,但如果我能做得更多,你也會得到一個。 –

+0

不用擔心,我不在意......如果您還有其他問題,我會很樂意詳細說明 – ianpojman