2009-03-31 8 views
3

이 질문은 가장 좋은 방법은

내가이 생성자가 ... 느낌 구분 된 문자열을 건네줍니다. 이 문자열에서 객체의 인스턴스 변수를 채워야합니다. 내 문자열 배열을 제공하기 위해 문자열을 쉽게 구분할 수 있습니다. 난 단순히 배열을 통해 반복하고 현재 배열 인덱스를 기반으로 if 또는 스위치/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]; 
     ... 
    } 
} 

아무에게도 이보다 더 좋은 방법이 있습니까/좋네요?

저는 자바로 작업하고 있습니다 만, 이것은 언어에 독립적이라고 생각합니다.

답변

4

Uhm ... "nasty"는 생성자가 매개 변수를 처리하는 방식입니다. 당신이 그것을 바꿀 수 없다면 당신의 코드 스 니펫 (snippet)은 좋을 것입니다.

당신은하지만, 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는 상수를 사용하는 것에 대한 좋은 제안을합니다.

또 다른 방법은 키가 인덱스이고 값이 속성의 이름 인 정수 키와 문자열 값을 사용하여 HashMap을 만드는 것입니다. 그런 다음 간단한 루프와 반사를 사용하여 속성을 설정할 수 있습니다. 반사 부분은 조금 느려질 수 있지만, 다른 언어 (예 : PHP)에서는 훨씬 더 깨끗합니다.

0

파이썬 특정 솔루션 :

이의이 params = ["instanceVariableA", "instanceVariableB"]을 가정 해 봅시다. 그 다음 :

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

가 작동해야합니다. 접근 자의 존재/부재 여부에 따라 대략

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

에 해당합니다.

비 동적 언어에서는 문자열에서 특정 종류의 참조/접근 자로 매핑하는 것과 동일한 효과를 얻을 수 있습니다.

0

단지 검증되지 않은 아이디어,

원래 토큰을 유지 (또한 zip 정지 중 목록이 다. 조심하십시오) ...당신이 그것을 사용해야하는 경우

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

다음, 다음, 단지

tokens[instanceVariableA]; 

따라서 더 이상 루프를

int instanceVariableA = 0; 
int instanceVariableB = 1; 

을 만들 수 없습니다 더 이상하지 VARIABLE_A_INDEX ...

어쩌면 JSON가 도움이 될까요?