2014-10-07 2 views
0

У меня есть класс, например Test; внутри которого находится вложенный статический класс, скажем, TestParams. толькоОпределить, объявлена ​​ли переменная в классе

TestParams содержит некоторые переменные типа String, относящиеся к классу Test

Проблема, с которой я столкнулся в том, что, в сеттеры класса Test, мне нужно проверить, если набор параметров является одним из 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.valueOf (String)! = Null'? –

+0

Но разве не просто просто «Установить » со всеми возможными ключами и использовать метод '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 - вы перебираете статические переменных в TestParams

2 - сохранить эти переменные в map<paramName,ParamValue> в тесте классе

3 - в вашем SetParam Вы спрашиваете, существует ли на карте значение

0

Существует такой механизм, BeanInfo или this, который связывает простой класс POJO (bean) с метаинформацией в отдельном классе. Его основное использование в настоящее время предоставляет окна с двумя столбцами для редактирования поля некоторого класса POJO. Использование PropertyDescriptor.

Теперь BeanInfo нуждается в некоторых инструментах, и все зависит от вашего варианта использования. Документация там никогда не была очень привлекательной, касаясь Serializable и т. Д. Но он обеспечивает функциональность, вам трудно будет изобретать.

Возможно, попробуйте сначала для JComponent, возможности, такие как проверка поля, все еще нуждаются в некотором кодировании.

Смежные вопросы