У меня есть пара классов, похожих на это;Может ли частное конечное поле подкласса java быть инициализировано до завершения суперконструктора?
public abstract class Class1 {
//...
public Class1() {
//...
function2();
//...
}
protected abstract void function2();
}
public class Class2 implements Class1 {
private final OnSomethingListener mOnSomethingListener = new OnSomethingListener() {
@Override
onSomething() {
doThatOtherThing();
}
}
protected void function2() {
//uses mOnSomethingListener
//however mOnSomethingListener is null when this function is called from super()
//...
}
public Class2() {
super();
}
}
Я предполагаю, что слушатель является пустым, потому что я эффективно ссылаться на него из super()
и это еще не экземпляр. Однако, я хочу сделать это final
, потому что, ну, это так. Могу ли я получить это поле (слушатель) для инициализации во времени, не помещая его в суперкласс (который не будет использовать слушателя, когда-либо)?
Правильное поведение должно превзойти «используя« финал », где это возможно». Я бы просто использовал getter для слушателя, который лениво инициализирует поле. Это делает порядок инициализации совершенно ясным и явным, не полагаясь на техничность. В качестве альтернативы вы могли бы запустить вторую функцию инициализации после конструкторов и вызвать 'function2()', но я все же не думаю, что это лучший выбор, чем удаление «final». – millimoose
Суперклас будет инициализирован перед тем, как один из его подклассов. –
http://stackoverflow.com/questions/11104339/create-an-object-before-the-super-call-in-java –