2016-02-26 8 views
1

Я пытаюсь изменить блок ниже, и нужно выяснить «правильный путь», чтобы сделать это:Java: что такое метод «лучших практик» для управления конструкторами классов для вызова при выполнении?

PRQ prq = new PRQ(); 
XYZ1 xyz1 = new XYZ1(); 
XYZ2 xyz2 = new XYZ2(); 

features = new ArrayList<MyFeature>(); 

// START OF MAIN BLOCK 
// This is rigid: need to comment out lines and rebuild to exclude features 
// Want to control this at execution time by a config file 
// 
features.add(new ABCFeatures()); 
features.add(new PRQFeatures(prq)); 
features.add(new XYZFeatures(xyz1,xyz2)); 
// ... 
// END OF MAIN BLOCK 

public class ABCFeatures extends MyFeature { 
    public ABCFeatures() 
    { 
    } 
} 

public class PRQFeatures extends MyFeature { 
    public PRQFeatures(final PRQ prq) 
    { 
    } 
} 

public class XYZFeatures extends MyFeature { 
    public XYZFeatures(final XYZ1 xyz1,final XYZ2 xyz2) 
    { 
    } 
} 

Таким образом, для каждых маркеров входных данных я вычисляю кучу разнородных признаков. Некоторым из них требуются ресурсы для вычисления, и они предоставляются при создании экземпляра (prq, xyz1, xyz2).

Прямо сейчас, если я хочу поэкспериментировать, запустив мой код с отключенными функциями, мне нужно прокомментировать соответствующую строку features.add(new ..., перестроить банку и затем повторно запустить. Слишком жестко! Я хочу контролировать это при выполнении, используя некоторый тип файла конфигурации, в котором указано, какие из функций включены и какие отключены.

Так 2 вопроса:

  1. Похоже, мне нужно использовать getClass().getDeclaredConstructors(), но я немного запутался о том, как именно это должно быть использовано
  2. Относящиеся к # 1 Я предполагаю: Есть ли предпочтительный способ указать конфигурацию? То есть, должен ли он быть JSON/XML-файлом в определенном формате? Существуют ли существующие механизмы на Java для поддержки именно такого типа сценариев?
+0

[ 'Preferences'] (https://docs.oracle.com/javase/ 8/docs/api/java/util/prefs/Preferences.html) может быть тем, что вы хотите. – resueman

ответ

1

Почему getDeclaredConstructors()? Просто заверните вызовы в features.add(MyFeature) в операторе if, который зависит от вашего файла конфигурации.

Properties cfg=new Properties(); 
cfg.load(new FileInputStream("features.properties"));//current directory, default encoding: take care 
if(cfg.getProperty("USE_ABC").equalsIgnoreCase("true")){ 
    features.add(new ABCFeatures()); 
} 
if(cfg.getProperty("USE_PRQ").equalsIgnoreCase("true")){ 
    features.add(new PRQFeatures(prq)); 
} 

Конечно, вы можете использовать константы для имен свойств, функция инкапсулировать проверки значения свойств и т.д.

+0

Спасибо! Наверное, я старался быть фантазией, но я не думаю, что мне нужно что-нибудь более интересное, чем ваше решение. :) –

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

  • Нет связанных вопросов^_^