Re[2]: Получить доступ к this перед вызовом super в конструкторе
От: vsb Казахстан  
Дата: 19.07.19 16:09
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Оно совсем не глупое. До вызова super не отработал конструктор базового класса. Если , например, поля производного класса определяются в конструкторе через поля базового, то нетрудно себе представить, чем это может закончиться.


Хз, не вижу проблемы. До вызова конструктора базового класса поля содержат нулевые значения, после вызова конструктора отрабатывают инициализаторы, если они есть. Ну и да, в данном случае мне this нужен просто как указатель, а не делать что-то с ним. Причём по факту так и есть, можно в конструкторе базового класса прокастовать this до производного класса и спокойно делать что угодно и ничего не бахнет.

На самом деле самое глупое то, что я вообще не могу никакой код написать до вызова super, пусть он даже к объекту класса пока не имеет никакого отношения. Вот этому объяснения я не вижу и не удивлюсь, если в байткоде такого ограничения нет. Тем более, что по факту любое выражение, переданное параметром в super, таки вычисляется до вызова super.

PD>Запрет на доступ к this на первый взгляд менее логичен, так как this — это ссылка на объект и она изменена быть не может внутри вызова super(). Так что взять ее вроде как безопасно, и я пока не вижу, к каким проблемам это могло бы привести. Но что ты сможешь сделать, взяв ее ? Присваивать ее полям нельзя — еще не сконструированы поля базового класса, так что см. выше.


Я могу передать this в new AutoCompleteRenderer(). Ну или просто сделать AutoCompleteRenderer не статическим вложенным классом, передав его неявно. Никаких проблем это вызвать не может, т.к. я его в конструкторе использовать не буду. Ну теоретически понятно, что мог бы, и увидел бы инициализированный нулями объект, плохо-плохо, понимаю.

PD>Передать параметру конструктора ? Чем это будет лучше, чем если сделать это после вызова super ? Завести локальную переменную, как в твоем гипотетическом примере внизу ? Это такой ящик Пандоры открыть, что мало никому не покажется. Кто мне в таком случае запретит передать в new AutoCompleteRenderer() какое-то поле базового класса ?


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