Tengo algunas clases, como se muestra aquíobtener bloque de inicialización estática para funcionar en un java sin cargar la clase
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
}
}
¿Cómo puedo cambiar TrueFalseQuestion
clase para que la El método estático siempre se ejecuta para que obtenga 1 en lugar de 0 cuando ejecuto mi método principal. No quiero ningún cambio en el método principal.
Estoy tratando de implementar los patrones de fábrica donde las subclases se registran en la fábrica, pero he simplificado el código para esta pregunta.
Como referencia, este diseño surgió para evitar la necesidad de que la fábrica conociera las clases de preguntas (aquí: http : //stackoverflow.com/questions/2582357/augment-the-factory-pattern-in-java). –
No había visto esa pregunta. Algo necesita saber sobre las implementaciones de la interfaz de la pregunta, ya sea directamente en la fábrica o mediante algún tipo de archivo de configuración. La única otra forma es, como dije, pasar por todas las clases en el classpath y ver si implementan Question. También tenga en cuenta la advertencia sobre tener una fábrica incompletamente construida en mi respuesta anterior. Puede funcionar ahora, pero no hay garantías sobre el estado del objeto en el futuro (o incluso en el presente, a través de plataformas). –