Информация об изменениях

Сообщение Получить доступ к this перед вызовом super в конструкторе от 18.07.2019 9:09

Изменено 18.07.2019 9:18 vsb

Получить доступ к this перед вызовом super в конструкторе
Появилась необходимость получить доступ к this перед вызовом super в конструкторе.

Имеется класс AutoCompleteTextField с конструктором

public AutoCompleteTextField(final String id, final IModel<T> model, final Class<T> type,
    final IAutoCompleteRenderer<T> renderer, final AutoCompleteSettings settings)


Я создаю наследника этого класса: DictAutoCompleteTextField

    private DictAutoCompleteTextField(String id, String dictName, IModel<Dict> model) {
        super(id, model, Dict.class, new AutoCompleteRenderer(), newAutoCompleteSettings());


Мне нужно передать в параметр rendered свою реализацию AutoCompleteRenderer, причём этой реализации нужен доступ к самому наследнику DictAutoCompleteTextField.

Возможности вызвать что-то вроде AutoCompleteTextFieldюsetRenderer нет, поле AutoCompleteTextFieldюrenderer final и инициализируется в конструкторе. Класс AutoCompleteTextField из фреймворка и менять я его тоже не могу. Функции вроде AutoCompleteTextField.getRenderer тоже нет, чтобы вызвать её и инициализировать мой Renderer после вызова super.

Единственное, что приходит в голову — завести статическую ThreadLocal переменную, присваивать ей AutoCompleteRenderer в его конструкторе и доставать его сразу после вызова super. Какой-то костыль. Ну или reflection-ом достать.

Можно ли придумать какой-нибудь синтаксичекий трюк или что-то в этом роде? По сути this на этом этапе уже существует, и я не вижу никакой проблемы в том, чтобы передать его в конструктор AutoCompleteRenderer, просто компилятор не даёт. Самое логичное для меня это код вроде

    private DictAutoCompleteTextField(String id, String dictName, IModel<Dict> model) {
        AutoCompleteRenderer renderer = new AutoCompleteRenderer();
        super(id, model, Dict.class, renderer, newAutoCompleteSettings());
        renderer.setOwner(this);


Но по какому-то глупому ограничению я не то, что получить доступ к this до вызова super не могу, я вообще ничего там делать не могу.
Получить доступ к this перед вызовом super в конструкторе
Появилась необходимость получить доступ к this перед вызовом super в конструкторе.

Имеется класс AutoCompleteTextField с конструктором

public AutoCompleteTextField(final String id, final IModel<T> model, final Class<T> type,
    final IAutoCompleteRenderer<T> renderer, final AutoCompleteSettings settings)


Я создаю наследника этого класса: DictAutoCompleteTextField

    private DictAutoCompleteTextField(String id, String dictName, IModel<Dict> model) {
        super(id, model, Dict.class, new AutoCompleteRenderer(), newAutoCompleteSettings());


Мне нужно передать в параметр rendered свою реализацию AutoCompleteRenderer, причём этой реализации нужен доступ к самому наследнику DictAutoCompleteTextField.

Возможности вызвать что-то вроде AutoCompleteTextFieldюsetRenderer нет, поле AutoCompleteTextFieldюrenderer final и инициализируется в конструкторе. Класс AutoCompleteTextField из фреймворка и менять я его тоже не могу. Функции вроде AutoCompleteTextField.getRenderer тоже нет, чтобы вызвать её и инициализировать мой Renderer после вызова super.

Единственное, что приходит в голову — завести статическую ThreadLocal переменную, присваивать ей AutoCompleteRenderer в его конструкторе и доставать его сразу после вызова super. Какой-то костыль. Ну или reflection-ом достать.

Можно ли придумать какой-нибудь синтаксичекий трюк или что-то в этом роде? Самое логичное для меня это код вроде

    private DictAutoCompleteTextField(String id, String dictName, IModel<Dict> model) {
        AutoCompleteRenderer renderer = new AutoCompleteRenderer();
        super(id, model, Dict.class, renderer, newAutoCompleteSettings());
        renderer.setOwner(this);


Но по какому-то глупому ограничению я не то, что получить доступ к this до вызова super не могу, я вообще ничего там делать не могу.