Обычно Java требует, чтобы надкласс был сконструирован перед конструированием подкласса и до вызова любого из его методов. В частности, требуется, чтобы первой строкой конструктора шёл вызов super конструктора надкласса иначе возникает синтаксическая ошибка на этапе компилляции.
Однако, эта защита имеет "дырку": если в конструкторе надкласса используются методы, которые переопределены в подклассе, то использоваться будут последние.
У меня это приводит к некой чехарде.
У меня есть коллекция -- класс StorageWithTrue, в котором хранятся объекты типа IncertitudeDescription. Их можно туда добавлять и убирать. При добавлении в объект вносятся изменения, которые отражаются целостность системы хранящихся внутри StorageWithTrue объектов IncertitudeDescription. В частности, например, поскольку IncertitudeDescription представляют собой выражения, в них есть поле, указывающее, в каком другом IncertitudeDescription данный IncertitudeDescription использован в качестве подвыражения. Это нужно чтобы не было повторов и т.п.
Теперь я пишу класс Tempo extends StorageWithTrue, в котором должны храниться объекты типа Ancestral extends IncertitudeDescription. Суть в том, что Ancestral поддерживают все те же правила целостности, что и IncertitudeDescription, плюс ещё упорядочены по важности в векторе queue.
То есть, все методы класса Tempo, которые согласно их описаниям работают с IncertitudeDescription, на самом деле работают с Ancestral. Ситуация примерно такая же, как с Graphics, который на самом деле всегда Graphics2D.
И вот я переопределил метод put таким образом, чтобы он не только делал всё, что обычно делается с IncertitudeDescription, но ещё и клал объект в queue.
При этом, в конструкторе Tempo предусмотрено создание объекта на основе StorageWithTrue, при этом все элементы должны переложиться из первого во второй.
Так вот, получается, что я не могу проинициализировать queue до вызова конструктора надкласса, в то время как в конструкторе надкласса он используется через вызов переопределённого метода put.
Я применил обычный прием типа
if( queue == null ) {
queue = new Vector<Ancestral>();
}
queue.add(wrp);
но теперь у меня получилась занятная штука, что инициализация в теле класса
private Vector<Ancestral> queue = null;
выполняется ПОСЛЕ того, как queue уже заполняется.
Вопроса, собственно, как такового нет. Просто я понимаю, что действую в какой-то запрещённой области. В частности, мне сейчас придётся убрать = null из тела класса и считать, что объект = null по умолчанию неизвестно-когда. Хотел бы, чтобы кто-то посоветовал, как всё это осуществить поправильней.