2011-03-22 18 views
6

Tengo una clase base que debe construirse con el parámetro. En la clase hija, necesito preparar este parámetro antes de construir la clase base, pero en Java debe llamarse súper antes que cualquier otra cosa. Cuál es la mejor manera de manejar esta situación (vea el ejemplo simple a continuación).Prepara el parámetro para el super constructor

class BaseClass { 
    protected String preparedParam; 

    public BaseClass(String preparedParam) { 
     this.param = param; 
    } 
} 

class ChildClass { 

    public ChildClass (Map<String, Object> params) { 
     // need to work with params and prepare param for super constructor 
     super(param); 
    } 
} 

Respuesta

11

Se puede crear un estática método, que realiza la transformación y llamar a eso.

class ChildClass { 

    static String preprocessParams(Map<String, Object> params) { 
     ... 
     return someString; 
    } 

    public BaseClass(Map<String, Object> params) { 
     super(preprocessParams(params)); 
    } 
} 
5

Aquí es uno de los enfoques:

class ChildClass { 
    public ChildClass(Map<String, Object> params) { 
     super(process(params)); 
    } 

    private static String process(Map<String, Object> params) { 
     // work with params here to prepare param for super constructor 
    } 
} 
0

clasificaría respuesta de Romano como el mejor hasta ahora. Si la clase padre proporciona un constructor predeterminado, puede instanciar un objeto de super y luego usar el método setter.

2

debido a la cantidad de parámetros que deben prepararse/inicializarse es simple factory method mejor solución para mí. Es una solución un poco más clara desde mi punto de vista. De todos modos, gracias a todos por las respuestas.

class BaseClass { 
    protected Object preparedParam; 

    public BaseClass(Object preparedParam) { 
    this.preparedParam = preparedParam; 
    } 
} 

class ChildClass extends BaseClass { 

    private ChildClass(Object preparedParam) { 
    super(preparedParam); 
    } 

    public static ChildClass createChildClass(Map<String, Object> params) { 
    Object param1 = params.get("param1"); 

    // prepare params here 

    ChildClass result = new ChildClass(param1); 

    // do other stuff 

    return result; 
    } 
} 
+0

A veces, el super constructor toma un valor, pero la superclase tiene ningún método para recuperar el objeto que se ha pasado. Si este es el caso, y que necesita dicho objeto en la superclase, así como en usted tiene el código, entonces el método de fábrica es una solución, mientras que el método de preparación estática no es una solución. –

Cuestiones relacionadas