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 № 1Este 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.