Construtor Java e Ordem de Inicialização de Campo
Eu sei que os construtores de objetos Java inicializam implicitamente os campos não estáticos de suas instâncias. No entanto, não tenho certeza da ordem em que isso acontece em uma hierarquia de classes. Por exemplo
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));
}
}
O construtor do pai chama um método na classe filho, que lança uma exceção como o valor deList<Shape> bag
atualmente é nulo.
Posso definir um construtor filho e chamar super (), mas essa deve ser a primeira linha no corpo do construtor (o que significa que ainda não tenho a chance de inicializar o bag antes degetNextPiece
é chamado)
Estou perdendo algo óbvio.