强制键入字符串键/ ID

时间:2013-06-26 13:58:47

标签: oop types reuseidentifier

在通用的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实例的类)

2 个答案:

答案 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 ++中做同样的事情,但这是一个很好的注意点。