2009-03-31 9 views
3

diese Frage fühlt sich an wie sie bereits gefragt worden wäre, aber ich habe nichts geht so hier gefunden ...Der beste Weg Objekt aus getrennten String zu bauen (hoffentlich nicht geschlungen Fall)

I Konstruktor haben, die ist reichte eine Zeichenfolge, die begrenzt ist. Von dieser Zeichenfolge muss ich die Instanzvariablen eines Objekts auffüllen. Ich kann die Zeichenkette leicht durch die Begrenzte teilen, um mir eine Reihe von Zeichenketten zu geben. Ich weiß, dass ich einfach durch das Array iterieren und meine Instanzvariablen mit Hilfe von ifs oder einer switch/case-Anweisung basierend auf dem aktuellen Array-Index setzen kann - aber das fühlt sich einfach ein wenig unangenehm an. Pseudo-Code:

Hat jemand irgendwelche Ideen, wie ich das besser/netter mache?

Für was es wert ist, arbeite ich in Java, aber ich denke, das ist Sprache unabhängig.

Antwort

4

Uhm ... "böse" ist in der Art, wie der Konstruktor die Parameter behandelt. Wenn Sie das nicht ändern können, ist Ihr Code-Snippet so gut wie es sein könnte.

Sie for-Schleife von der loswerden konnte, obwohl ...

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

und dann Konstanten einführen (für readibilty):

instanceVariableA = tokens[VARIABLE_A_INDEX]; 
instanceVariableB = tokens[VARIABLE_B_INDEX]; 

HINWEIS: Wenn Sie die Zeichenfolge ändern könnte Mit der Parameter-Syntax könnte man einen einfachen Parser einführen und mit etwas Nachdenken dieses Ding etwas eleganter handhaben:

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

Ich mag diesen Weg, der for-each ist viel weniger überladen ... – Fraser

+0

Ich bin gelaufen für den ersten Teil dieser Antwort. Es ist konzeptionell sehr einfach und vermeidet das Durcheinander einer Schleife überhaupt. oh - und ich kann die Eingabezeile nicht einfach ändern. Dank so) –

0

Konnten Sie nicht eine "for-each" -Schleife verwenden, um viel Unordnung zu beseitigen?

0

Ich denke wirklich, die Art, wie Sie es tun, ist in Ordnung, und Manrico macht einen guten Vorschlag über die Verwendung von Konstanten.

Eine andere Methode wäre, eine HashMap mit Integer-Schlüsseln und String-Werten zu erstellen, wobei der Schlüssel der Index und der Wert der Name der Eigenschaft ist. Sie können dann eine einfache Schleife und einige Reflektionen verwenden, um die Eigenschaften festzulegen. Der Reflektionsteil könnte dies etwas langsam machen, aber in einer anderen Sprache (zB PHP) wäre dies viel sauberer.

0

Python-spezifische Lösung:

Lasst uns params = ["instanceVariableA", "instanceVariableB"] sagen. Dann:

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

sollte funktionieren; das entspricht ungefähr

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

je nach Vorhandensein/Fehlen von Zugriffsmethoden.

In einer nicht-dynamischen Sprache könnten Sie den gleichen Effekt erzielen, indem Sie eine Zuordnung von Strings zu Referenzen/Accessoren irgendeiner Art erstellen.

(auch aufpassen, dass zip stoppt, wenn entweder Liste abläuft.)

0

nur eine ungetestete Idee,

das ursprüngliche Token halten ...

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

dann

int instanceVariableA = 0; 
int instanceVariableB = 1; 

erstellen, wenn Sie es verwenden müssen, dann

nur
tokens[instanceVariableA]; 

daher nicht mehr Schleifen, nicht mehr VARIABLE_A_INDEX ...

vielleicht JSON könnte helfen?