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

検証されていないアイデアに過ぎませんが、

元のトークンを保持します...

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

次に作成します

int instanceVariableA = 0;
int instanceVariableB = 1;

使用する必要がある場合は、

tokens[instanceVariableA];

したがって、これ以上ループはありませんVARIABLE_A_INDEX...

おそらくJSONが役立つでしょうか?

于 2009-03-31T13:30:22.483 に答える
0

「for-each」ループを使用して混乱の多くを解消できないでしょうか?

于 2009-03-31T13:21:03.673 に答える
0

あなたのやり方は素晴らしいと思います.Manricoは定数の使用についても良い提案をしています.

もう 1 つの方法は、キーがインデックスで、値がプロパティの名前である整数キーと文字列値で 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 に答える