Soy consciente de que los constructores de objetos Java inicializan implícitamente los campos no estáticos de su instancia. Sin embargo, no estoy seguro del orden en que esto sucede en una jerarquía de clases. Por ejemplo:Constructor de Java y orden de inicialización de campo
abstract public class AbstractPieceSequence implements PieceSequence
{
private Tetromino current;
private Tetromino preview;
public AbstractPieceSequence()
{
advance();
}
@Override
public final void advance()
{
if (preview == null) {
current = getNextPiece();
preview = getNextPiece();
} else {
current = preview;
preview = getNextPiece();
}
}
abstract protected Tetromino getNextPiece();
}
public class ShufflePieceSequence extends AbstractPieceSequence
{
private List<Shape> bag = new LinkedList<Shape>();
@Override
protected Tetromino getNextPiece()
{
if (bag.size() == 0) {
Collections.addAll(bag, Shape.I, Shape.J, Shape.L, Shape.O, Shape.S, Shape.T, Shape.Z);
}
return Tetromino.tetrominoes.get(bag.remove(0));
}
}
constructor del padre llama a un método en la clase hija, la cual se produce una excepción como el valor de List<Shape> bag
es actualmente nula.
Puedo definir un constructor hijo y llamar a super(), pero esa debe ser la primera línea del cuerpo del constructor (lo que significa que todavía no tengo la oportunidad de inicializar el paquete antes de llamar al getNextPiece
).
Me falta algo obvio.