2012-02-18 10 views
5

は私が私が持っていた電話インタビューの間に、次の質問をしました。スーパークラスのコンストラクタ引数をインターセプトするには?次のクラス定義を考えると</p> <p>::ランダムな整数ジェネレータを使用してスーパークラスを初期化し</p> <pre><code>public class ClassA { public ClassA(int x) { // do some calculationand initialize the state } } </code></pre> <p>とその子クラス

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

あなたは、xの値(someRandomIntegerValGeneratorによって生成ランダムint)を傍受し、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

+0

@aviadで失われますか? –

+0

「this」の代わりに「super」であってはなりませんか?タスクの条件までになるだけですか? – Gangnus

関連する問題

 関連する問題