Как перехватить аргумент конструктора суперкласса? - PullRequest
5 голосов
/ 19 февраля 2012

Мне задали следующий вопрос во время телефонного интервью:

Учитывая следующее определение класса:

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, но я думаю, что это должно быть более простое решение.

Есть мысли?

1 Ответ

10 голосов
/ 19 февраля 2012

Как насчет этого:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...