J'ai quelques classes comme indiqué iciobtenir le bloc d'initialisation statique pour exécuter dans un java sans charger la classe
public class TrueFalseQuestion implements Question{
static{
QuestionFactory.registerType("TrueFalse", "Question");
}
public TrueFalseQuestion(){}
}
...
public class QuestionFactory {
static final HashMap<String, String > map = new HashMap<String,String>();
public static void registerType(String questionName, String ques) {
map.put(questionName, ques);
}
}
public class FactoryTester {
public static void main(String[] args) {
System.out.println(QuestionFactory.map.size());
// This prints 0. I want it to print 1
}
}
Comment puis-je changer TrueFalseQuestion
classe afin que la méthode statique est toujours exécuté de sorte que j'obtiens 1 au lieu de 0 quand je cours ma méthode principale? Je ne veux pas de changement dans la méthode principale.
Je suis en train d'essayer de mettre en œuvre les modèles d'usine où les sous-classes s'enregistrent avec l'usine, mais j'ai simplifié le code pour cette question.
Pour référence, cette conception est venu d'éviter la nécessité de l'usine sachant sur les classes de questions (ici: http : //stackoverflow.com/questions/2582357/augment-the-factory-pattern-in-java). –
Je n'avais pas vu cette question. Quelque chose doit être mis au courant des implémentations de l'interface de Question, que ce soit directement à l'usine ou à travers un fichier de configuration. La seule autre façon est, comme je l'ai dit, de parcourir toutes les classes du chemin de classe et de voir si elles implémentent la question. Notez également la mise en garde d'avoir une usine incomplètement construite dans ma réponse ci-dessus. Cela peut fonctionner maintenant, mais il n'y a aucune garantie sur l'état de l'objet dans le futur (ou même dans le présent, sur toutes les plateformes). –