
Трюк как не вызвать конструктор предка.
Все знают, что конструктор предка, если его не объявить в конструкторе наследника, будет вызываться автоматически. И мы можем только определить место когда его вызывать. Оказывается можно вообще не вызывать конструктор предка.
Разгадка кроется уже в начале статьи. Нам надо самим определить вызов конструктора предка, но сделать это так, чтобы он не вызывался.
Почему не написать if(false)? — некоторые говорят, что компилятор может соптимизировать такой код и убрать его.
Небольшой апдейтик. Как 100% не вызвать ненужный код конструктора предка. Вобще это не хак, а стандартный метод.
Оформляем инициализацию экземпляра не в конструкторе, который остается пустым, а в методе или статической функции с возвратом этого экземпляра. Я рекомендую статич.функцию поскольку можно всем предкам давать одно имя (например init), возвращать корректный класс и это не будет пересекаться с именами методов при наследовании и не требовать дополнительного приведения результата к нужному классу.
Запись будет такая:
MyObject = CMyClass.staticInit( new CMyClass ).
Запись становится больше, чем просто new CMyClass, зато придает дополнительную гибкость.
Разгадка кроется уже в начале статьи. Нам надо самим определить вызов конструктора предка, но сделать это так, чтобы он не вызывался.
if ( !true ) {
super();
}
Почему не написать if(false)? — некоторые говорят, что компилятор может соптимизировать такой код и убрать его.
Небольшой апдейтик. Как 100% не вызвать ненужный код конструктора предка. Вобще это не хак, а стандартный метод.
Оформляем инициализацию экземпляра не в конструкторе, который остается пустым, а в методе или статической функции с возвратом этого экземпляра. Я рекомендую статич.функцию поскольку можно всем предкам давать одно имя (например init), возвращать корректный класс и это не будет пересекаться с именами методов при наследовании и не требовать дополнительного приведения результата к нужному классу.
Запись будет такая:
MyObject = CMyClass.staticInit( new CMyClass ).
Запись становится больше, чем просто new CMyClass, зато придает дополнительную гибкость.
- +0
- puzzlesea
Комментарии (5)