Affectation de la variable finale avec try / catch

Parce que je crois que c’est une bonne pratique de programmation, je fais que toutes mes variables (locales ou d’instance) soient final si elles sont destinées à être écrites une seule fois.

Cependant, je constate que lorsque l’atsortingbution d’une variable peut provoquer une exception, vous ne pouvez pas rendre cette variable définitive:

 final int x; try { x = Integer.parseInt("someinput"); } catch(NumberFormatException e) { x = 42; // Comstackr error: The final local variable x may already have been assigned } 

Est-il possible de faire cela sans avoir recours à une variable temporaire? (ou n’est-ce pas le bon endroit pour un modificateur final?)

Une façon d’y parvenir est d’introduire une variable temporaire (non final ), mais vous avez dit ne pas vouloir le faire.

Une autre méthode consiste à déplacer les deux twigs 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 de scope appropriée, l’approche générale la plus pratique pourrait consister à la laisser non final .

Si, par contre, x est une variable membre, je vous conseille d’utiliser un temporaire non final 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 avez plus de 1 énoncé dans votre bloc try et catch, le premier dit: x = 42. Après quelques autres instructions, le bloc try échoue et il va au bloc catch, où votre Dire x = 30. Maintenant, vous avez défini x deux fois.