Javaオブジェクトコンストラクターは、インスタンスの非静的フィールドを暗黙的に初期化することを知っています。ただし、これがクラス階層で発生する順序はわかりません。例えば:
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));
}
}
親のコンストラクターは子クラスのメソッドを呼び出します。このメソッドは、の値List<Shape> bag
が現在nullであるため、例外をスローします。
子コンストラクターを定義してsuper()を呼び出すことはできますが、これはコンストラクター本体の最初の行である必要があります(つまり、呼び出される前にbagを初期化する機会がまだありませんgetNextPiece
)。
明らかな何かが欠けています。