TechTalk#2 – Java’s Final Keyword

TechTalk #2

Java’s Final Keyword

 

Le mot-clé « final » peut être utilisé dans différents endroits en Java: à la déclaration d’une classe, à la déclaration d’un member d’une classe et à la déclaration d’une variableou d’un paramètre de méthode.
À la déclaration d’une classe, « final » permet d’interdire qu’elle soit sous-classée. L’utiliser sur une classe indique que l’on s’est posé la question de savoir si on pouvait sous-classer sa classe ou non. Pour rappel, l’héritage n’est pas forcément un bon design. Par défaut, si une classe n’a pas été conçue pour être sous-classée, il sera contre-indiqué de la sous-classer. De plus en Android, cela permet d’avoir un gain en performances, mais uniquement sous Android 6 (pas de compilateur JIT).

 Par défaut, il faut mettre le mot clé « final » lorsque l’on définit une classe.

À la déclaration d’un member de classe, « final » permet d’obtenir l’atomicité de l’état de l’objet. Les champs « final » doivent être settés dans le constructeur et ils seront forcément non nuls (on évite des « if myMember != null »).

Malheureusement, en Android, dans les « Activity » et « Fragment », on ne peut pas déclarer des members « final » car les constructeurs sont sans paramètres et appelés par le système. Dans les autres cas, il est conseillé de mettre le mot-clé « final » sur les membres qui doivent être initialisés en même temps que l’objet afin d’avoir un état consistant de notre objet.

Dans le cas particulier des constantes, l’utilisation des 2 mots-clés « static » et « final » permet de définir une constante. La valeur d’un tel member ne pourra plus être modifiée et sera partagée entre toutes les instances de cette classe.

 Utiliser le mot-clé « final » pour définir des constantes.

À la déclaration d’une variable ou d’un paramètre de méthode, utiliser « final » permet d’empêcher le ré assignement de sa variable. Ce n’est pas de la réelle immutabilité et il n’y a pas non plus d’impact sur la performance (en Android).

Il n’est pas utile de définir ses variables en « final » excepté dans les 2 cas suivants : utilisation d’une variable à l’intérieur d’une classe anonyme et lorsque l’on a un scope très long pour la variable et que l’on veut s’assurer qu’elle n’est pas réassignée.

TechTalk animé par Olivier Tabone | Co-fondateur Directeur Technique chez Ripple Motion