在构造函数中调用可重写的方法,如 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
        }
    }
}