泄露这个构造函数

时间:2012-04-25 15:18:25

标签: java swing

  

可能重复:
  “this” reference escaping during construction?

我想知道在构造函数问题中泄漏这个是否应用于此实例,因为我相信构造函数必须调用setJMenuBar()方法来完成它的构造,这里是类实现:

public class StaffManagerMainWindow extends JFrame implements ActionListener {

    public StaffManagerMainWindow(String title, Image icon) throws HeadlessException {
        ...
        setJMenuBar();
    }

    private void setJMenuBar() {
        ...
        exitItem.addActionListener(this);
        ...
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

2 个答案:

答案 0 :(得分:3)

我认为构造函数中存在泄漏。您在对象的完整初始化之前传递“this”。

答案 1 :(得分:1)

如果您的程序是多线程的,那么构造函数中的this泄漏可能会成为一个问题。你将它赋予exitItem,它可以在构造函数完成之前从另一个线程调用actionPerformed()。这是不行。它可能会严重破坏你的程序,特别是如果你在图片中添加子类。

创建一个init()方法和一个工厂方法:

public class StaffManager {
    public static StaffManager create() {
        StaffManager staffManager = new StaffManager();
        staffManager.init();
        return staffManager;
    }

    private StaffManager() {
    }

    private void init() {
        // Add listeners here.
    }
}

编辑:因为Swing对象总是在事件派发线程上创建,所以泄漏this在这种情况下不会有任何影响。不过我不喜欢这样做。