/ / Swing e modificador final - java, swing

Swing e modificador final - java, swing

Por que o SWING sempre me força a marcar alguns objetos específicos como finais? Como isso às vezes torna as coisas um pouco difíceis, existe uma maneira de evitar isso?

(EXEMPLO INCOMPLETO) onde me obriga a marcar a variável IExchangeSource como final:

public class MainFrame {

private final JTextArea textArea = new JTextArea();


public static void main(final IExchangeSource s) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new MainFrame(s);
}
});
}
public MainFrame(final IExchangeSource s) {
//build gui
s.update();

Respostas:

18 para resposta № 1

Este tem nada para fazer com o Swing, nada mesmo. Você deve mostrar seu código que tem um exemplo disso, mas provavelmente você está usando uma classe interna, possivelmente uma classe interna anônima, e se você usá-los e tentar usar variáveis ​​dentro da classe interna que são locais para um método abrangente (ou outro bloco, como um construtor), então você está obrigado a fazer essas variáveis ​​final ou promovê-los para campos de classe. Mais uma vez esta é uma Java exigência, não um Balanço requerimento.

Um exemplo de Swing:

public MyConstructor() {
final int localIntVar = 3;  // this must be final

myJButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// because you use the local variable inside of an anon inner class
// not because this is a Swing application
System.out.println("localIntVar is " + localIntVar);
}
});
}

e um exemplo Non-Swing:

public void myMethod() {
final String foo = "Hello"; // again it must be final if used in
// an anon inner class

new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(foo);
try {
Thread.sleep(1000);
} catch (Exception e) {}

}
}
}).start();
}

Existem vários truques para evitar isso:

  • Promova a variável para um campo de classe, dando a ela escopo de classe.
  • Faça com que a classe interna anônima chame um método da classe externa. Mas então, a variável ainda precisará ter escopo de classe.

Editar 2 Anthony Accioly postou uma resposta com um ótimo link, mas por razões desconhecidas apagou sua resposta. Eu gostaria de postar seu link aqui, mas adoraria vê-lo reabrir sua resposta.

Não é possível referir-se a uma variável não final dentro de uma classe interna definida em um método diferente