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

+0

Если я переведу весь код из метода setJMenuBar() внутри конструктора, тогда я получаю предупреждающее сообщение «утечка этого в конструкторе», но для моего случая компилятор ничего не жалует – MinhHoang

+1

Это просто означает, что статический анализ, выполняемый по коду, ограничен - - он просто проверяет, передаете ли вы 'this' явно в вызове метода. –

ответ

3

I t hink есть утечка в конструкторе. Вы передаете «это» перед полной инициализацией объекта.

+0

, так почему компилятор не дал никаких предупреждающих сообщений? – MinhHoang

+1

Я никогда не слышал о компиляторе, проверяющем утечку 'this'. Это не проблема сама по себе, она просто открывает двери для проблем. Вы уверены, что это предупреждение компилятора, а не какой-либо другой инструмент проверки, который у вас есть? Какой компилятор вы используете? Java/Eclipse, какая версия? Просто любопытно. –

+0

@MarkoTopolnik: Netbeans IDE sir – MinhHoang

1

Утечка this в конструкторе может быть проблемой, если ваша программа многопоточная. Вы даете это exitItem, который может вызывать actionPerformed() из другого потока до завершения вашего конструктора. Это не в порядке. Это может сильно испортить вашу программу, особенно если вы добавите подклассы к изображению.

Создать метод инициализации() и фабричный метод вместо:

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

    private StaffManager() { 
    } 

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

Edit: Поскольку объекты распашных всегда создается на событие диспетчеризации нити, утечка this не будет иметь никакого эффекта в этом случае. Тем не менее я предпочитаю не делать этого.

+0

Теперь, Kjetil, почему бы любой юридический код вызвать обратный вызов Swing вне потока событий-отправки? Даже если бы это было так, это было бы проблемой само по себе. –

+0

Я не знаю всю картину здесь, но я предполагаю, что этот класс может быть инициализирован в другом потоке одновременно с событием. В любом случае утечка данных это плохая идея, особенно если класс предназначен для потоковой безопасности. – Kjetil

+0

Классы Swing UI по определению не являются потокобезопасными - весь код Swing ** MUST ** должен выполняться в потоке отправки событий. Все слушатели событий, безусловно, будут выполняться исключительно на EDT. –

Смежные вопросы