Сообщение Получить доступ к this перед вызовом super в конструкторе от 18.07.2019 9:09
Изменено 18.07.2019 9:18 vsb
Получить доступ к this перед вызовом super в конструкторе
Появилась необходимость получить доступ к this перед вызовом super в конструкторе.
Имеется класс AutoCompleteTextField с конструктором
Я создаю наследника этого класса: DictAutoCompleteTextField
Мне нужно передать в параметр rendered свою реализацию AutoCompleteRenderer, причём этой реализации нужен доступ к самому наследнику DictAutoCompleteTextField.
Возможности вызвать что-то вроде AutoCompleteTextFieldюsetRenderer нет, поле AutoCompleteTextFieldюrenderer final и инициализируется в конструкторе. Класс AutoCompleteTextField из фреймворка и менять я его тоже не могу. Функции вроде AutoCompleteTextField.getRenderer тоже нет, чтобы вызвать её и инициализировать мой Renderer после вызова super.
Единственное, что приходит в голову — завести статическую ThreadLocal переменную, присваивать ей AutoCompleteRenderer в его конструкторе и доставать его сразу после вызова super. Какой-то костыль. Ну или reflection-ом достать.
Можно ли придумать какой-нибудь синтаксичекий трюк или что-то в этом роде? По сути this на этом этапе уже существует, и я не вижу никакой проблемы в том, чтобы передать его в конструктор AutoCompleteRenderer, просто компилятор не даёт. Самое логичное для меня это код вроде
Но по какому-то глупому ограничению я не то, что получить доступ к 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 с конструктором
Я создаю наследника этого класса: DictAutoCompleteTextField
Мне нужно передать в параметр rendered свою реализацию AutoCompleteRenderer, причём этой реализации нужен доступ к самому наследнику DictAutoCompleteTextField.
Возможности вызвать что-то вроде AutoCompleteTextFieldюsetRenderer нет, поле AutoCompleteTextFieldюrenderer final и инициализируется в конструкторе. Класс AutoCompleteTextField из фреймворка и менять я его тоже не могу. Функции вроде AutoCompleteTextField.getRenderer тоже нет, чтобы вызвать её и инициализировать мой Renderer после вызова super.
Единственное, что приходит в голову — завести статическую ThreadLocal переменную, присваивать ей AutoCompleteRenderer в его конструкторе и доставать его сразу после вызова super. Какой-то костыль. Ну или reflection-ом достать.
Можно ли придумать какой-нибудь синтаксичекий трюк или что-то в этом роде? Самое логичное для меня это код вроде
Но по какому-то глупому ограничению я не то, что получить доступ к 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 не могу, я вообще ничего там делать не могу.