在通用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:另一种解决方案是只使用enum作为键,并将字符串作为一个简单字段。但这需要在Foo和FooManager(实例化Foo实例的类)之间添加高度耦合
您可以随时进行
var f = new Foo("myFirstID")
然后做
map.add(f.id, f);
另一件需要探索的事情是,如果只需要拥有该键来提供对象foo的唯一性,那么可以探索在c#和java世界中都可用的hashset集合。如果你提供了一个IEqualityComparer,你可以添加和删除你的foo对象。如果您不需要使用字符串acessor访问您的哈希集,那么这可能是一个解决方案。
在C#中,您可以执行以下操作:
string foo;
map.add(foo = "myFirstID", new Foo(foo));
我不确定在Java或C++中是否也能做到这一点,但这是一个很好的起点。