在构造函数中调用可重写的方法,如 Swing 的 add()
2022-09-01 21:25:10
我知道从构造函数调用可重写方法是一个坏主意。但我也看到,Swing 在任何地方都在这样做,在构造函数中一直会出现类似代码的代码。add(new JLabel("Something"));
以NetBeans IDE为例。它对构造函数中的可重写调用非常挑剔。然而,当它生成Swing代码时,它会将所有这些方法调用放入一个方法中......然后从构造函数调用它!隐藏问题并禁用警告的好方法(NetBeans 没有“从构造函数调用可重写方法的私有方法”警告)。但这并不是解决问题的真正方法。add()
initializeComponents()
这是怎么回事?我已经这样做了很长时间,但总是对此感到不安。有没有更好的方法来初始化Swing容器,除了制作一个额外的方法(不要忘记每次调用它,这有点无聊)?init()
例
这是一个非常人为的例子,说明事情可能会出错:
public class MyBasePanel extends JPanel {
public MyBasePanel() {
initializeComponents();
}
private void initializeComponents() {
// layout setup omitted
// overridable call
add(new JLabel("My label"), BorderLayout.CENTER);
}
}
public class MyDerivedPanel extends MyBasePanel {
private final List<JLabel> addedLabels = new ArrayList<>();
@Override
public void add(Component comp, Object constraints) {
super.add(comp);
if (comp instanceof JLabel) {
JLabel label = (JLabel) comp;
addedLabels.add(label); // NPE here
}
}
}