2016-02-26 3 views
1

Je suis en train de modifier le bloc ci-dessous et ont besoin de trouver « la bonne façon » de le faire:Java: quelle est la meilleure façon de contrôler les constructeurs de classe à appeler lors de l'exécution?

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) 
    { 
    } 
} 

Ainsi, pour chaque jeton de données d'entrée je calcule un tas de fonctionnalités hétérogènes. Certaines d'entre elles nécessitent des ressources pour être calculées et celles-ci sont fournies à l'instanciation (prq, xyz1, xyz2).

Maintenant, si je veux expérimenter en exécutant mon code avec certaines fonctionnalités désactivées, j'ai besoin de commenter la ligne features.add(new ... correspondante, de reconstruire le fichier jar puis de le réexécuter. Trop rigide! Je veux contrôler cela à l'exécution en utilisant un type de fichier de configuration qui indique quelles fonctionnalités sont activées et lesquelles sont désactivées.

donc 2 questions:

  1. On dirait que je dois utiliser getClass().getDeclaredConstructors(), mais je suis un peu confus au sujet exactement comment il est censé être utilisé
  2. Relatif à # 1 Je suppose que: Y at-il un préféré façon de spécifier la configuration? Autrement dit, devrait-il être un fichier JSON/XML dans un format spécifique? Existe-t-il des machines Java pour supporter exactement ce type de scénario?
+0

[ 'Preferences'] (https://docs.oracle.com/javase/ 8/docs/api/java/util/prefs/Preferences.html) pourrait être ce que vous voulez. – resueman

Répondre

1

Pourquoi getDeclaredConstructors() Pourquoi? Il suffit d'encapsuler les appels à features.add(MyFeature) dans une instruction if qui dépend de votre fichier de configuration.

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)); 
} 

Bien sûr, vous pouvez utiliser des constantes pour les noms de propriété, une fonction permettant de vérifier la valeur encapsuler des propriétés, etc.

+0

Merci! Je suppose que j'essayais d'être chic, mais je ne pense pas que j'ai besoin de quelque chose de plus fantaisiste que votre solution. :) –