2009-03-31 5 views
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

Uhm ... "nasty"は、コンストラクタがパラメータを処理する方法です。それを変更できない場合、コードスニペットは可能な限り良好です。

あなたはしかし、forループを取り除くことができ

...

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

、その後(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 
} 
+0

私はこのように好きです、for-eachははるかにあまり包み込まれていません... – Fraser

+0

私はこの答えの最初の部分に行ってしまった。これは概念的には非常に簡単でループの混乱を避けます。ああ - 私は簡単に入力文字列を変更することはできません。ありがとう:o) –

0

混乱の多くを解消するために "for-each"ループを使用できませんか?

0

本当にあなたがやっているやり方はいいと思うし、Manricoは定数の使用についても良い提案をしている。

もう1つの方法は、キーがインデックスで、値がプロパティの名前である整数キーと文字列値を使用してHashMapを作成することです。その後、単純なループといくつかのリフレクションを使ってプロパティを設定することができます。反射部分はこれを少し遅くするかもしれませんが、別の言語(例えば、PHPなど)ではこれがはるかにクリーンになります。

0

のPython固有のソリューション:

のはparams = ["instanceVariableA", "instanceVariableB"]を言ってみましょう。次に:

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

は動作するはずです。アクセサーの有無によって、

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

とほぼ同じです。

非動的言語では、文字列からある種の参照/アクセサへのマッピングを構築するのと同じ効果を達成することができます。

(どちらかのリストがなくなったときにもそのzip停止を注意してください。)

0

だけでテストされていないアイデア、

は、元のトークンを保ちます...

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

あなたがそれを使用する必要がある場合、その後、その後、ちょうど

tokens[instanceVariableA]; 

ので、これ以上のループ、これ以上VARIABLE_A_INDEX ...

多分JSONを

int instanceVariableA = 0; 
int instanceVariableB = 1; 

を作成が役立つ可能性がありますか?

関連する問題