我有一个类,其构造函数如下所示:
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 设置所需的其他方法。这些方法中的两个需要在子类中被覆盖,以便特定于它们的 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
这里的方法 requires b
,不幸的是当时没有初始化。
重组此代码的适当方法是什么,以便:
- 需要的字段是在需要之前设置的。
- 使用
FooPanel
(和其他面板)的代码并没有因为这种变化而变得杂乱无章。
非常感谢任何帮助。谢谢。