2012-04-25 72 views
1

可能重复:
“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."); 
    } 
} 
+1

是的,它泄漏。为什么你的'ActionListener'不能私有? – trashgod 2012-04-25 15:24:47

+0

如果我移动构造函数中setJMenuBar()方法的所有代码,那么我会收到警告消息“在构造函数中泄漏这个”,但对于我的情况,编译器不会抱怨任何东西 – MinhHoang 2012-04-25 15:26:25

+1

这只意味着对代码执行的静态分析是有限的 - - 它只是检查你是否在方法调用中显式传递'this'。 – 2012-04-25 15:33:10

回答

3

I t在构造函数中存在泄漏。您在完成对象初始化之前传递“this”。

+0

那为什么编译器没有给出任何警告信息? – MinhHoang 2012-04-25 15:29:19

+1

我从来没有听说过编译器检查泄漏'this'。这本身并不是问题,它只是为问题打开了大门。你肯定这是一个编译器警告,而不是你有其他检查工具?你使用什么编译器? Java/Eclipse,哪个版本?只是好奇。 – 2012-04-25 15:30:35

+0

@MarkoTopolnik:Netbeans IDE先生 – MinhHoang 2012-04-25 15:34:33

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不会在这种情况下,任何影响。不过,我宁愿不这样做。

+0

现在来吧,Kjetil,为什么会有任何合法代码在Event-Dispatch Thread之外调用Swing回调?即使这样做,这本身也是一个问题。 – 2012-04-25 15:41:47

+0

我不知道整个图片,但我猜这个类可能会在事件发生的同一时间在不同的线程中初始化。在任何情况下,泄漏这是一个坏主意,特别是如果该类是为了线程安全。 – Kjetil 2012-04-25 15:48:22

+0

根据定义,Swing UI类不是线程安全的 - 所有Swing代码**必须在事件派发线程上执行。所有事件监听器肯定会在EDT上执行。 – 2012-04-25 15:51:00