Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

final

Porque a palavra chave final faz com que o erro desapareça nesse codigo?

package br.com.caelum.olamundo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class OlaMundoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.principal);

        Button botao = (Button) findViewById(R.id.botao) ;

        final EditText campo = (EditText) findViewById(R.id.campo);
        final TextView texto = (TextView) findViewById(R.id.texto);

        botao.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View arg0) {
                texto.setText(campo.getText());

            }
        });


    }
}

`
2 respostas
solução!

Olá Alexandre,

Quando criamos uma classe anônima no Java, a classe anônima faz uma cópia de todas as variáveis locais no escopo onde ela é criada. Por exemplo, de acordo com o seu código, a classe anônima teria uma cópia da varíavel campo e uma cópia da variável texto (lembre-se que estamos falando de cópias das referências aqui).

Agora, vamos supor que o seguinte código funcionasse sem a exigência do final nas variáveis.


EditText campo = (EditText) findViewById(R.id.campo);
TextView texto = (TextView) findViewById(R.id.texto);

botao.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        texto.setText(campo.getText());
    }
});

campo = (EditText) findViewById(R.id.outro_campo);

O que aconteceria agora se a gente clicasse no botão? Como temos uma cópia da variável campo, o valor dela ainda seria a referência para o id campo. Mas perceba que depois da classe anônima nós trocamos o valor da variável campo para o EditText com id outro_campo! Agora temos uma inconsistência pois apesar de utilizarem a mesma variável campo, a classe anônima e a outra classe estão com referências diferentes e isso pode gerar confusão no código pois fica mais difícil de saber o que cada variável está referenciando.

Para evitar esse tipo de confusão, o Java vai exigir que utilizemos somente variáveis final dentro de classes anônimas pois desse jeito, a variável só pode receber um único valor durante toda a sua vida, como se fosse uma constante. Nesse caso, no exemplo acima, não conseguiríamos mudar a referência armazenda na variável campo e portanto não teríamos o problema de inconsistência.

entendido