2012-02-18 12 views
5

me hizo la siguiente pregunta durante la entrevista telefónica que tuve:¿Cómo se intercepta el argumento del constructor de super clase?

Dada la siguiente definición de clase:

public class ClassA { 
    public ClassA(int x) { 
     // do some calculationand initialize the state 
    } 
} 

y su clase hija que inicializa una superclase utilizando un generador de números enteros aleatorios.

public class ClassB extends ClassA { 
    public ClassB() { 
     super(StaticUtilityClass.someRandomIntegerValGenerator()) 
    } 
} 

que necesita para interceptar el valor de x (el azar int producido por someRandomIntegerValGenerator) y almacenarlo en miembro de ClassB. ClassA no puede ser cambiado. Terminé sin idea de cómo se puede hacer esto porque la primera llamada dentro del constructor de ClassB debe ser la llamada a super(). Hasta que se llamó al super() no hay estado para ClassB y el valor producido por el someRandomIntegerValGenerator no se puede asignar a ningún miembro de ClassB. La única dirección que tenía era usar un ThreadLocal , pero creo que debería ser una solución más fácil.

¿Alguna idea?

Respuesta

10

¿Qué tal esto:

public class ClassB extends ClassA { 
    public ClassB() { 
     this(StaticUtilityClass.someRandomIntegerValGenerator()); 
    } 

    private ClassB(int x) { 
     super(x); 
     // Can access x here, e.g.: 
     this.x = x; 
    } 


    private int x; 
} 
+0

la x se pierde en ese punto – aviad

+0

@aviad: Perdido en qué momento? –

+0

¿No debería ser "super" en lugar de "esto"? ¿Solo para estar a la altura de las condiciones de la tarea? – Gangnus

Cuestiones relacionadas