コンストラクターが以下のようなクラスがあります。
abstract class BasePanel extends JPanel {
public BasePanel(A a) {
// initializing fields from values passed to ctor
this.a = a;
// initializing gui components
initializeComponents();
setupPanels();
concludeUiSetup();
}
// stuff
}
コンストラクターでは、最初にコンストラクターに渡された値で初期化されるフィールドが初期化されます。次に、UI セットアップに必要な他のメソッドが順番に呼び出されます。これらのメソッドのうち 2 つは、固有の UI セットアップのためにサブクラスでオーバーライドする必要があります。
FooPanel
を拡張するクラスを考えてみましょうBasePanel
。コンストラクターには、さらにいくつかの初期化パラメーターが必要です。
class FooPanel extends BasePanel {
public FooPanel(A a, B b) {
super(a);
this.b = b;
}
@Override
public void initializeComponents() {
super.initializeComponents();
// I require b here, but oops, b is not initialized at this point, and so
// this will throw NPE.
someTextField.setText(b.get());
}
// stuff
}
initializeComponents
メソッドはここで requiresb
を必要としますが、残念ながらその時点では初期化されていません。
このコードを次のように再構成する適切な方法は何でしょうか。
- 必要なフィールドは、必要になる前に設定されます。
- (および他のパネル)を使用するコードは
FooPanel
、この変更によってあまり乱雑になりません。
どんな助けでも大歓迎です。ありがとう。