Java Language Utiliser 'final' pour restreindre l'héritage et remplacer


Exemple

Classes finales

Lorsqu'il est utilisé dans une déclaration de class , le modificateur final empêche les autres classes d'être déclarées qui extend la classe. Une classe final est une classe "feuille" dans la hiérarchie des classes d'héritage.

// This declares a final class
final class MyFinalClass {
    /* some code */
}

// Compilation error: cannot inherit from final MyFinalClass
class MySubClass extends MyFinalClass {
    /* more code */
}

Cas d'utilisation pour les classes finales

Les classes finales peuvent être combinées à un constructeur private pour contrôler ou empêcher l'instanciation d'une classe. Cela peut être utilisé pour créer une soi-disant "classe utilitaire" qui définit uniquement les membres statiques; c'est-à-dire des constantes et des méthodes statiques.

public final class UtilityClass {

    // Private constructor to replace the default visible constructor
    private UtilityClass() {}

    // Static members can still be used as usual
    public static int doSomethingCool() {
        return 123;
    }

}

Les classes immuables doivent également être déclarées comme final . (Une classe immuable est une classe dont les instances ne peuvent pas être modifiées après leur création; reportez-vous à la rubrique Objets indisponibles .) En faisant cela, vous ne pouvez pas créer une sous-classe mutable d'une classe immuable. Cela violerait le principe de substitution de Liskov qui exige qu'un sous-type obéisse au «contrat comportemental» de ses supertypes.

D'un point de vue pratique, déclarer une classe immuable comme étant final permet de raisonner plus facilement sur le comportement du programme. Il résout également les problèmes de sécurité dans le scénario où du code non fiable est exécuté dans un sandbox de sécurité. (Par exemple, puisque String est déclaré comme final , une classe de confiance n'a pas à craindre d'être amenée à accepter une sous-classe mutable, que l'appelant non fiable pourrait alors modifier subrepticement.)

Un inconvénient des classes final est qu’elles ne fonctionnent pas avec certains cadres moqueurs tels que Mockito. Mise à jour: Mockito version 2 supporte maintenant les moqueries des classes finales.

Méthodes finales

Le final modificateur peut également être appliqué aux méthodes pour éviter qu'elles soient remplacées dans les sous-classes:

public class MyClassWithFinalMethod {

    public final void someMethod() {
    }
}

public class MySubClass extends MyClassWithFinalMethod {

    @Override
    public void someMethod() { // Compiler error (overridden method is final)
    }
}

Les méthodes finales sont généralement utilisées lorsque vous souhaitez restreindre ce qu'une sous-classe peut changer dans une classe sans interdire complètement les sous-classes.


Le final modificateur peut également être appliqué aux variables, mais la signification de final pour les variables n’est pas liée à l’héritage.