2012-02-18 9 views
5

mi è stato chiesto alla seguente domanda durante un'intervista telefonica che ho avuto:Come intercettare l'argomento del costruttore di super-classe?

Data la seguente definizione di classe:

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

e la sua classe figlia che inizializza una classe di super-utilizzando un generatore intero casuale.

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

è necessario intercettare il valore di x (int a caso prodotto da someRandomIntegerValGenerator) e riporlo in membro ClassB. ClassA non può essere modificato. Alla fine non ho idea di come questo possa essere fatto perché la prima chiamata all'interno del costruttore ClassB deve essere la chiamata a super(). Fino a quando non è stato chiamato super(), non esiste uno stato per ClassB e il valore prodotto da someRandomIntegerValGenerator non può essere assegnato a nessun membro ClassB. L'unica direzione che avevo era usare un ThreadLocal ma penso che dovrebbe essere una soluzione più semplice.

Qualche idea?

risposta

10

ne dite di questo:

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

l'x si perde in quel punto – aviad

+0

@aviad: Perso a che punto? –

+0

Non dovrebbe invece "questo" essere "super"? Solo per essere all'altezza delle condizioni del compito? – Gangnus

Problemi correlati