这个问题感觉好像已经被问到了,但我没有找到任何东西,所以这里......
我有一个构造函数,它被传递一个被分隔的字符串。从该字符串我需要填充对象的实例变量。我可以通过分隔符轻松拆分字符串以给我一个字符串数组。我知道我可以简单地遍历数组并使用ifs或基于当前数组索引的switch / case语句设置我的实例变量 - 但是这感觉有点讨厌。伪代码:
String[] tokens = <from generic string tokenizer>;
for (int i = 0;i < tokens.length;i++) {
switch(i) {
case(0): instanceVariableA = tokens[i];
case(1): instanceVarliableB = tokens[i];
...
}
}
有没有人对我如何做得更好/更好有任何想法?
对于它的价值,我在Java工作,但我想这是语言独立。
答案 0 :(得分:4)
嗯......“讨厌的”是构造函数处理参数的方式。如果你无法改变它,那么你的代码片段就像它可能一样好。
你可以摆脱for循环,但是......
instanceVariableA = tokens[0];
instanceVariableB = tokens[1];
然后引入常量(for readibilty):
instanceVariableA = tokens[VARIABLE_A_INDEX];
instanceVariableB = tokens[VARIABLE_B_INDEX];
注意:如果你可以改变字符串参数语法,你可以引入一个简单的解析器,并且稍微反思一下,以稍微优雅的方式处理这个东西:
String inputString = "instanceVariableA=some_stuff|instanceVariableB=some other stuff";
String[] tokens = inputString.split("|");
for (String token : tokens)
{
String[] elements = token.split("=");
String propertyName = tokens[0];
String propertyValue = tokens[1];
invokeSetter(this, propertyName, propertyValue); // TODO write method
}
答案 1 :(得分:0)
你能不能使用“for-each”循环消除大部分混乱?
答案 2 :(得分:0)
我真的认为你这样做的方式很好,Manrico对使用常量也提出了很好的建议。
另一种方法是使用整数键和字符串值创建HashMap,其中键是索引,值是属性的名称。然后,您可以使用简单的循环和一些反射来设置属性。反射部分可能会使这有点慢,但在另一种语言(例如,PHP)中,这将更加清晰。
答案 3 :(得分:0)
特定于Python的解决方案:
我们说params = ["instanceVariableA", "instanceVariableB"]
。然后:
self.__dict__.update(dict(zip(params, tokens)))
应该工作;这大致相当于
for k,v in zip(params, tokens):
setAttr(self, k, v)
取决于访问者的存在/不存在。
在非动态语言中,您可以实现构建从字符串到某种类型的引用/访问器的映射的相同效果。
(还要注意当列表用完时zip
停止。)
答案 4 :(得分:0)
只是一个未经考验的想法,
保留原始令牌......
String[] tokens = <from generic string tokenizer>;
然后创建
int instanceVariableA = 0;
int instanceVariableB = 1;
如果你需要使用它,那么只需
tokens[instanceVariableA];
因此不再有循环,不再有VARIABLE_A_INDEX
...
也许 JSON 可能有帮助?