在通用的OO语言中(比如C ++,C#,java) 我有一个带有字符串ID的对象映射,相同的ID也是相对对象的键
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 :(得分:0)
你可以随时做你的
var f = new Foo("myFirstID")
然后再做一次
map.add(f.id, f);
另一件需要探索的事情是,如果只需要提供该密钥以提供对象foo的唯一性,那么请探索在c#和java world中都可用的hashset集合。如果您提供IEqualityComparer,则只需添加和删除foo对象即可。如果您不需要使用字符串acessor访问您的hashset,这可以是一个解决方案。
答案 1 :(得分:0)
在C#中,您可以执行以下操作:
string foo;
map.add(foo = "myFirstID", new Foo(foo));
我不确定你是否可以在Java或C ++中做同样的事情,但这是一个很好的注意点。