0

在通用 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));

这个解决方案更好,仍然非常冗长,在同一个类中仍然存在一些耦合,并且没有强制执行值(就像 enum 一样);

你能想到更好的模式吗?

PS:另一种解决方案是只使用枚举作为键,并将字符串作为一个简单的字段。但这需要在 Foo 和 FooManager 之间增加高耦合(类实例化 foo 实例)

4

2 回答 2

0

在 C# 中,您可以执行以下操作:

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

我不确定你是否可以在 Java 或 C++ 中做同样的事情,但这是一个很好的起点。

于 2013-06-26T14:10:37.327 回答
0

你总是可以做你的

var f = new Foo("myFirstID")

然后做一个

map.add(f.id, f);

要探索的另一件事是,如果需要该键只是为了提供对象 foo 的唯一性,请探索在 c# 和 java 世界中都可用的 hashset 集合。如果您提供 IEqualityComparer,您可以添加和删除您的 foo 对象。如果您不需要使用字符串访问器访问哈希集,这可能是一个解决方案。

于 2013-06-26T14:07:18.330 回答