2014-10-07 2 views
0

클래스가 있습니다 (예 : Test). 그 안에는 중첩 된 정적 클래스 인 TestParams가 있습니다.변수가 클래스에 선언되어 있는지 확인하십시오.

TestParams만을 테스트 클래스를 참조 일부 문자열 변수를 포함 내가 직면하고 문제는 테스트 클래스의 세터에, 내가 설정 매개 변수에 선언 된 PARAMS 중 하나입니다 있는지 확인해야한다는 것입니다

Params 클래스

public class Test { 

    protected String n; 
    protected int num; 

    public static class TestParams { 
    public static final String PARAM_N="n"; 
    public static final String PARAM_NUM="num"; 
    } 

    public void setParam(String key, Object value) { 
    // Need to check here the if key is defined in TestParams 
    // keep adding conditions to IF statement when more params added?? 
    if(key.equals(TestParams.PARAM_N) || (key.equals(TestParams.PARAM_NUM)) 
     // Do some stuff 
    } 

} 

여러 조건과 IF 문을 대체 할 수있는 방법이 있나요 :

시나리오는 아래 코드에 표시됩니다? 같은 (뭔가 TestParams()에서 키 아니면 코드 구조에 대한 몇 가지 다른 디자인

+0

리플렉션을 시도 할 수 있습니다. – talex

+0

enum을 만들고 'Enum.valueOf (String)! = null'을 사용 하시겠습니까? –

+0

하지만 가능한 모든 키를 가지고'Set '을 사용하고'contains' 메소드를 사용하는 것이 쉽지 않을까요? – talex

답변

2

가 당신에 대해 요구하고있는 특정 문제를 해결하기 위해, 나는 반사를 사용하는 것보다 다른 방법 볼 경우 :

private boolean isValidKey(String str) { 
    for (Field f : TestParams.class.getFields()) 
     try { 
      if (f.get(null).equals(str)) 
       return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    return false; 
} 

난 강력하게 디자인을 다시 생각하는 것이 좋습니다 것입니다 있지만.

0

을 당신은 같은지도에 모든 필드를 넣을 수

public class Test { 

    protected String n; 
    protected int num; 

    public static class TestParams { 
    public static Map<String, Object> PARAMS; 

    // This will initialize the map statically 
    static { 
     PARAMS.put("PARAM_N", "n"); 
     PARAMS.put("PARAM_NUM", "num"); 
    } 
    } 

    public void setParam(String key, Object value) { 
    for(Map.Entry<String, Object> entry : TestParams.PARAMS){ 
     if(entry.getValue().equals(key)){ 
     //do stuff 
     } 
    } 
    } 
} 
0

해결책이 될 수 반사를 사용 :

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import java.util.HashMap; 
import java.util.Map; 


public class Test { 

    protected String n; 
    protected int num; 

    private Map<String,Object> params = new HashMap<String,Object>(); 

    public Test(){ 
     Field[] fields = TestParams.class.getDeclaredFields(); 
     for (Field field : fields) { 
      if (Modifier.isStatic(field.getModifiers())) { 
       try { 
       params.put(field.getName(), field.get(null)); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 
    } 

    public static class TestParams { 
    public static final String PARAM_N="n"; 
    public static final String PARAM_NUM="num"; 
    } 

    public void setParam(String key, Object value) { 
     if(params.containsValue(key)){ 
      // do .... 
     }else{ 
      // do ... 
     } 
    } 

} 

1 -

2 TestParams

에서 당신 루프 가 정적 변수 - 테스트 클래스

3에 map<paramName,ParamValue>에서 이러한 변수를 저장 -에 SetParam 방법은지도에 값이 있는지 묻습니다.

0

BeanInfo 또는과 같은 메커니즘이 있습니다., 간단한 POJO (bean) 클래스를 별도의 클래스에있는 메타 정보와 연관시킵니다. 주요 용도는 요즘 POJO 클래스의 필드를 편집 할 수있는 2 열의 속성 창을 제공하는 것입니다. PropertyDescriptor을 사용하십시오.

이제 BeanInfo에는 도구가 필요하며 사용 사례에 따라 다릅니다. 거기서 나온 문서는 Serializable 등을 만지고 결코 호소력이 없었다. 하지만 기능을 제공하기 때문에 재발견하기가 어려울 것입니다.

아마도 JComponent를 먼저 시도해보십시오. 필드 유효성 검사와 같은 가능성은 여전히 ​​코딩이 필요합니다.

관련 문제