强制键入字符串键/ID



在通用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++中是否也能做到这一点,但这是一个很好的起点。

最新更新