2013-06-26 75 views
0

在一個通用面向對象的語言(比如C++,C#,JAVA) 我有地圖上用字符串ID和相同ID的對象也是關鍵的相對對象的強制打字字符串鍵/ IDS

class Foo(){ 
    Foo(string id){this.id = id;} 
    string id; 
    string otherProperty; 
} 
map<string,Foo> foos; 

現在如果我想添加一個對象我

map.add("myFirstID", new Foo("myFirstID")); 
map.add("mySecondID", new Foo("mySecondID")); 

我不喜歡重複的字符串,它只會得到最糟糕的(想通過關鍵字進行檢索時,它只是爆炸)。

我不能使用枚舉(因爲像C++中,它不能很容易地轉換成字符串一些語言,我需要它)

唯一的選擇似乎是

const string MY_FIRST_ID = "myFirstID"; 
const string MY_SECOND_ID = "mySecondID"; 
級聯

到那麼

foos.add(MY_FIRST_ID, new Foo(MY_FIRST_ID)); 

該解決方案是更好的,它仍然是非常冗長,仍然有在同一類中的一些耦合,有一個在值沒有執行(也像有一個枚舉);

你能想出更好的模式嗎?

PS:另一種解決方案是隻使用枚舉作爲鍵,並把字符串作爲一個簡單的字段。但是,這需要增加Foo和FooManager之間的高耦合(類實例foo的情況下)

回答

0

你總是可以做你的

var f = new Foo("myFirstID") 

,然後做一個

map.add(f.id, f); 

另一件要探討的是,如果需要擁有該鍵來提供對象foo的唯一性,請探索哈希集合,在c#和java世界中均可用。如果你提供了一個IEqualityComparer,你可以添加和刪除你的foo對象。如果您不需要使用字符串存儲器訪問您的哈希集,這可能是一個解決方案。

0

在C#中,你可以這樣做:

string foo; 
map.add(foo = "myFirstID", new Foo(foo)); 

我不知道,如果你可以做同樣在Java或C++中,但它是一個很好的起始點。

+0

謝謝,但問題只是推遲到第一個需要的map.get(「myFirstID」); 此外,不提供任何保證,也不保證所提供的價值。 – jalone