2012-04-25 45 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