Parce que je crois que c'est une bonne pratique de programmation, je crée toutes mes variables (locales ou d'instance) final
si elles ne doivent être écrites qu'une fois.
Cependant, je remarque que lorsqu'une affectation de variable peut générer une exception, vous ne pouvez pas rendre ladite variable finale:
final int x;
try {
x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
x = 42; // Compiler error: The final local variable x may already have been assigned
}
Y a-t-il un moyen de le faire sans recourir à une variable temporaire? (ou n'est-ce pas le bon endroit pour un dernier modificateur?)
Une façon de faire est d'introduire une variable temporaire (non -final
), mais vous avez dit que vous ne vouliez pas le faire.
Une autre méthode consiste à déplacer les deux branches du code dans une fonction:
final int x = getValue();
private int getValue() {
try {
return Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
return 42;
}
}
Que cela soit pratique ou non dépend du cas d'utilisation exact.
Dans l’ensemble, tant que x
est une variable locale à portée appropriée, l’approche générale la plus pratique peut être de la laisser non -final
.
Si, par contre, x
est une variable membre, mon conseil serait d'utiliser une variable non -final
temporaire lors de l'initialisation:
public class C {
private final int x;
public C() {
int x_val;
try {
x_val = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
x_val = 42;
}
this.x = x_val;
}
}
Non, ce n’est pas le bon endroit. Imaginez que vous ayez plus d’une déclaration dans votre bloc try and catch, la première indique: x = 42. Dire x = 30. Maintenant, vous avez défini x deux fois.