Android Final vs textviews privés

simple question peut-être stupide. J’ai une activité de connexion qui lance une autre activité, et voici le code:

public class LoginActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); ActionBar actionBar = getActionBar(); actionBar.hide(); Button btnLogin = (Button) findViewById(R.id.btnLogin); final TextView tvUsername = (TextView) findViewById(R.id.tvUsername); final TextView tvPassword = (TextView) findViewById(R.id.tvPassword); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (tvUsername.getText().toSsortingng().length()<1) { Toast msg = Toast.makeText(LoginActivity.this, "Enter a Username", Toast.LENGTH_LONG); msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 70); msg.show(); tvUsername.requestFocus(); } else if (tvPassword.getText().toString().length()<1) { Toast msg = Toast.makeText(LoginActivity.this, "Enter a Password", Toast.LENGTH_LONG); msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200); msg.show(); tvPassword.requestFocus(); } else { startActivity(new Intent(LoginActivity.this,CrewScheduleActivity.class)); finish(); } } }); } } 

Ma question concerne les textviews. Eclipse a essentiellement dit que je devais les rendre finales pour pouvoir les utiliser dans l’événement onClick du bouton. NP donc j’ai fait ça et ça a fonctionné.

La question est la suivante: quelle est la différence entre placer ces éléments au-dessus de @Override en tant que privé et à l’intérieur de OnCreate en tant que finale?

Cela a à voir avec la fermeture en Java . Fondamentalement, lorsque vous utilisez une classe anonyme, les valeurs (pas les objects eux-mêmes) utilisées sont copiées dans cette classe à des fins d’utilisation. Par conséquent, il n’a aucun sens de renvoyer ou de modifier ces variables dans la classe, elles doivent donc être final .

Cependant, si la variable fait plutôt partie de la classe contenant la classe anonyme, c’est différent. Fondamentalement, votre classe interne a une référence à l’object LoginActivity (en tant que LoginActivity.this ) et peut utiliser et modifier ses membres et ses méthodes.

Lorsque vous les mettez “au-dessus de @Override”, vous les LoginActivity variables de membre de la classe LoginActivity . Par conséquent, ils peuvent être consultés par la classe anonyme.

En résumé, la différence est que: les variables final sont locales à la méthode et copiées dans la classe anonyme; Les variables membres sont locales à la classe qui les contient et sont modifiées par la classe anonyme.

Si vous souhaitez réutiliser les données de la classe anonyme ultérieurement, utilisez une variable membre. Si vous n’en avez besoin que dans onCreate() et dans la classe anonyme, une variable final suffira.

Lorsque vous déclarez le champ TextView (ou n’importe quel champ) comme public, vous pouvez y accéder directement par n’importe quelle autre classe, ce que je ne crois pas être votre intention. il n’y a aucune raison de rendre la variable TextView publique.
Si ce paramètre est défini sur privé, il existe une garantie que sa valeur ne sera pas remplacée par une autre classe, ce à quoi le mot-clé final a été conçu en premier lieu. Donc, définissez-le simplement comme privé, et vous n’aurez pas à vous soucier de la correction par Eclipse.
Donc, en résumé: rendre le champ privé / final garantit que la valeur ne peut pas être remplacée par une autre classe, ce qui est une bonne conception.

J’espère que cette randonnée aide. Je serai heureux de clarifier cela mieux si ce n’est pas le cas.