2012-02-18 85 views
5

有人問我電話採訪時以下問題我有:如何攔截超類的構造函數參數?

考慮下面的類定義:

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

和初始化使用隨機整數生成一個超類的子類。

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

你需要攔截x的值(隨機INT由someRandomIntegerValGenerator生產)並將其存儲在ClassB的構件。 ClassA不能更改。 我最終不知道如何做到這一點,因爲ClassB構造函數中的第一個調用需要調用super()。直到super()被調用,ClassB沒有狀態,並且someRandomIntegerValGenerator生成的值不能被分配給任何ClassB成員。我唯一的方向是使用 ThreadLocal 但我認爲這應該是一些更簡單的解決方案。

有什麼想法?

回答

10

如何:

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

的X是失去了這一點 – aviad 2012-02-18 22:07:33

+0

@aviad:迷失在什麼時候? – 2012-02-18 22:07:52

+0

不應該而是「這個」是「超級」嗎?只是爲了達到任務條件? – Gangnus 2012-02-18 22:09:40