En Java, seules les variables locales sont-elles effectivement finales ?

Je voudrais exploiter la fonctionnalité try-with-resources de Java 9 en insérant une variable de référence dans try with resources plutôt que la déclaration complète de la variable. Je comprends également que pour ce faire, je dois suivre la règle suivante : les variables utilisées comme ressources try-with-resources doivent être finales ou presque. Je vais commencer par une variable locale, puis passer à une variable d'instance.
Variable locale:
-Je fais une variable finale, qui suit la règle donnée et se compile bien :
Java:
public static void main (String[] args) throws IOException{
        final FileWriter fw = new FileWriter ("test.txt");
        try(fw) {
            //some code
        }
    }

-Si je supprimais également le mot-clé final, il serait à nouveau compilé car fw est effectivement considéré comme des variables finales qui ne sont initialisées qu'une seule fois et jamais mutées.
Java:
public static void main (String[] args) throws IOException{
     FileWriter fw = new FileWriter ("test.txt");
    try(fw) {
        //some code
    }
}

Variable d'instance :
Mais ce même modèle fonctionnera-t-il également pour la variable d'instance ? Essayons.

-Commençons par rendre la variable d'instance final, qui suit à nouveau la règle et se compile correctement :
Code:
public class Test {
  final FileWriter fw = new FileWriter ("a.txt");

    void m1() throws IOException {
        try(fw ) {
            //some code
        }
    }
}

-Si je supprime le mot-clé final, il devrait à nouveau compiler, n'est-ce pas ? Comme je ne suis pas en train de muter fw n'importe où mais de ne l'initialiser qu'une seule fois, cela devrait être effectif final. Malheureusement, cela ne fonctionnera pas :
Java:
public class Test {
   FileWriter fileWriter = new FileWriter ("a.txt");

    void m1() throws IOException {
        try(fileWriter) {
            //some code
        }
    }
}

Cela me donne un message : la variable utilisée comme ressource d'essai avec des ressources doit être finale ou effectivement finale. Donc après tout cela, je reviens à ma première question. La variable d'instance peut-elle être effectivement finale ou ce terme n'est-il utilisé que pour les variables locales ? Comme je viens de le montrer, je ne mute jamais une variable (qui devrait être considérée comme effectivement finale), mais le compilateur ne la menace jamais en tant que telle.
 
Haut