Ho un paio di classi, come mostrato quiottenere blocco di inizializzazione statico per l'esecuzione in un Java senza caricare 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
}
}
Come posso cambiare TrueFalseQuestion
classe in modo che il il metodo statico viene sempre eseguito in modo da ottenere 1 anziché 0 quando eseguo il metodo principale? Non voglio alcun cambiamento nel metodo principale.
Attualmente sto cercando di implementare gli schemi di fabbrica in cui le sottoclassi si registrano con la fabbrica ma ho semplificato il codice per questa domanda.
Per riferimento, questo progetto è nato per evitare la necessità della fabbrica di conoscere le classi di domande (qui: http : //stackoverflow.com/questions/2582357/augment-the-factory-pattern-in-java). –
Non avevo visto quella domanda. Qualcosa deve sapere circa le implementazioni dell'interfaccia di domande, sia che si tratti della fabbrica direttamente, sia attraverso qualche tipo di file di configurazione. L'unico altro modo è, come ho detto, passare attraverso tutte le classi sul classpath e vedere se implementano la domanda. Si noti anche l'avvertenza di avere una fabbrica incompletamente costruita nella mia risposta sopra. Potrebbe funzionare ora, ma non ci sono garanzie sullo stato dell'oggetto in futuro (o anche nel presente, attraverso le piattaforme). –