Java Swing анонимные действия - PullRequest
0 голосов
/ 30 марта 2011

Можно ли устанавливать действия, как в примере кода ниже?Есть ли возможные проблемы со сборкой мусора, которые могут быть вызваны этим?А если нет, что будет лучшим способом сделать это?

btnAwesomeButton=new JButton(new AbstractAction("Awesome Button") {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        //Do stuff here
        //Refer to the components on parent windows through ParentWindowClass.this.componentName      
    }

});

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Это очень распространенная идиома.Нет проблем с сборкой мусора, при условии, что вы не спрятали ссылку на экземпляр подкласса AbstractAction где-нибудь (например, на хеш-таблицу), где он будет сохраняться после возврата actionPerformed.

2 голосов
/ 30 марта 2011

Да, есть потенциальные ошибки в сборке мусора с этим.Однако другие ответы верны в том смысле, что это стандартная идиома.

Когда вы создаете такой анонимный внутренний класс, у него есть скрытая ссылка на внешний класс.Это означает, что до тех пор, пока эта кнопка существует с этим действием, на внешний класс будут ссылаться, как и на все, на что ссылается этот внешний класс.

Однако на практике это, как правило, не является проблемой, поскольку внешнийКласс обычно будет окном или панелью, где находится эта кнопка, и кнопка будет находиться рядом с ней, пока панель находится.Вот почему это стандартная идиома - это нормально.

2 голосов
/ 30 марта 2011

Да, это совершенно нормально. Это то, что мы называем анонимный внутренний класс . С этой проблемой вообще нет сборки мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...