Java Language final


Exemple

final en Java peut faire référence à des variables, des méthodes et des classes. Il y a trois règles simples:

  • la variable finale ne peut pas être réaffectée
  • la méthode finale ne peut pas être remplacée
  • la classe finale ne peut pas être prolongée

Coutumes

Bonne pratique de programmation

Certains développeurs considèrent comme une bonne pratique de marquer une variable finale lorsque vous le pouvez. Si vous avez une variable qui ne devrait pas être changée, vous devriez la marquer finale.

Une utilisation importante du mot-clé final pour les paramètres de méthode. Si vous voulez souligner qu'une méthode ne modifie pas ses paramètres d'entrée, marquez les propriétés comme étant finales.

public int sumup(final List<Integer> ints);

Cela souligne que la méthode sumup ne va pas changer les ints .

Accès en classe interne

Si votre classe interne anonyme veut accéder à une variable, la variable doit être marquée comme final

  public IPrintName printName(){
    String name;
    return new IPrintName(){
        @Override
        public void printName(){
            System.out.println(name);
        }
    };
}

Cette classe ne compile pas, comme la variable name , n'est pas définitif.

Java SE 8

Les variables finales sont une exception. Ce sont des variables locales qui ne sont écrites qu’une seule fois et peuvent donc être rendues définitives. Les variables finales sont accessibles à partir de classes anonymes.

variable final static

Même si le code ci-dessous est totalement légal lorsque la variable final foo n'est pas static , en cas de static elle ne compilera pas:

class TestFinal {
    private final static List foo;

    public Test() {
        foo = new ArrayList();
    }
}

La raison en est, répétons-le encore, la variable finale ne peut pas être réaffectée . foo étant statique, il est partagé entre toutes les instances de la classe TestFinal . Lorsqu'une nouvelle instance d'une classe TestFinal est créée, son constructeur est appelé et, par conséquent, foo est réaffecté, ce que le compilateur ne permet pas. Une manière correcte d’initialiser la variable foo dans ce cas est soit:

class TestFinal {
    private static final List foo = new ArrayList();
    //..
}

ou en utilisant un initialiseur statique:

class TestFinal {
    private static final List foo;
    static {
        foo = new ArrayList();
    }
    //..
}

final méthodes final sont utiles lorsque la classe de base implémente des fonctionnalités importantes que la classe dérivée n'est pas censée modifier. Ils sont également plus rapides que les méthodes non finales, car aucun concept de table virtuelle n’est impliqué.

Toutes les classes de wrapper de Java sont finales, telles que Integer , Long etc. Les créateurs de ces classes ne voulaient pas que quiconque, par exemple, étend Integer dans sa propre classe et modifie le comportement de base de la classe Integer. L'une des exigences pour rendre une classe immuable est que les sous-classes ne peuvent pas remplacer les méthodes. La manière la plus simple de le faire est de déclarer la classe comme final .