3

这个问题感觉好像已经被问过了,但我没有找到任何东西,所以这里......

我有一个构造函数,它被传递了一个分隔的字符串。我需要从该字符串中填充对象的实例变量。我可以很容易地用分隔符分割字符串,给我一个字符串数组。我知道我可以简单地遍历数组并使用 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,但我想这与语言无关。

4

5 回答 5

4

嗯...“讨厌”是构造函数处理参数的方式。如果您无法更改,那么您的代码片段将尽可能好。

不过,您可以摆脱 for 循环...

instanceVariableA = tokens[0];
instanceVariableB = tokens[1];

然后引入常量(为了便于阅读):

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
}
于 2009-03-31T13:18:34.883 回答
0

您不能使用“for-each”循环来消除大部分混乱吗?

于 2009-03-31T13:21:03.673 回答
0

我真的认为你这样做的方式很好,Manrico 也对使用常量提出了一个很好的建议。

另一种方法是创建一个带有整数键和字符串值的 HashMap,其中键是索引,值是属性的名称。然后,您可以使用一个简单的循环和一些反射来设置属性。反射部分可能会使这有点慢,但在另一种语言(例如 PHP)中,这会更干净。

于 2009-03-31T13:23:33.903 回答
0

特定于 Python 的解决方案:

比方说params = ["instanceVariableA", "instanceVariableB"]。然后:

self.__dict__.update(dict(zip(params, tokens)))

应该管用; 这大致相当于

for k,v in zip(params, tokens):
    setAttr(self, k, v)

取决于访问者的存在/不存在。

在非动态语言中,您可以构建从字符串到某种引用/访问器的映射来实现相同的效果。

(还要注意zip当任一列表用完时停止。)

于 2009-03-31T13:28:09.587 回答
0

只是一个未经检验的想法,

保留原始令牌...

String[] tokens = <from generic string tokenizer>;

然后创建

int instanceVariableA = 0;
int instanceVariableB = 1;

如果您需要使用它,那么只需

tokens[instanceVariableA];

因此不再有循环,不再VARIABLE_A_INDEX......

也许JSON可能会有所帮助?

于 2009-03-31T13:30:22.483 回答