final et autres mots-clés Java - 1

« Salut Amigo ! »

"Salut, Bilaabo !"

"Aujourd'hui je vais vous parler de plusieurs mots clés en Java. Mais je vais commencer par le plus intéressant : le mot clé final. "

"Vous pouvez utiliser le mot clé final lors de la déclaration d'une variable, d'une méthode ou d'une classe."

"Et pourquoi avons-nous besoin de final?"

"C'est assez simple. Si nous marquons une variable comme final, elle devient alors immuable :"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Je vois."

"Si nous marquons une méthode comme finale, alors la redéfinition de la méthode dans les classes dérivées est interdite :"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"Je vois. Mais pourquoi auriez-vous besoin d'interdire le remplacement d'une méthode ?"

"Eh bien, par exemple, supposons qu'un programmeur ait écrit beaucoup de code important dans une méthode et veuille garantir que toutes les classes qui héritent de sa classe auront le comportement spécifié."

"Et enfin, la troisième utilisation."

"Si nous marquons une classe avec le mot-clé final, elle ne peut pas être héritée."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

« Et pourquoi empêcherions-nous l'héritage d'une classe ?

"Vous devez comprendre que nous n'empêchons pas l'héritage d'être ennuyeux, mais plutôt pour des raisons de sécurité et d'intégrité du code. Si l'héritage de classe n'est pas interdit, cela implique qu'il est autorisé. Et que le code écrit par la classe designer fonctionnera correctement pour les objets de cette classe ainsi que pour les objets de toutes les classes dérivées."

"Mais si un développeur se rend compte que même de petits changements dans sa classe feront que tout cessera de fonctionner comme prévu, alors il vaut mieux interdire l'héritage."

"Par exemple, la classe String est déclarée comme final, comme le sont tous les types primitifs : Integer, Boolean, Double, Character…"

"Ah, j'ai compris. La classe String a été créée en tant que classe immuable et si elle devenait soudainement mutable, alors beaucoup de choses cesseraient de fonctionner."

"Eh bien, presque. Disons-le de cette façon : tout fonctionnerait presque comme avant, mais parfois il y aurait des erreurs qui seraient très difficiles à trouver et à comprendre. Ainsi, dans certains cas, hériter de classes ou de méthodes n'est pas vraiment un péché, mais l'interdire signifie moins d'erreurs à attraper plus tard."

« Où d'autre pouvez-vous utiliser final ? »

"Vous pouvez utiliser final avant les paramètres de fonction et avant les variables dans une méthode. Voici un exemple :"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"Et à quoi ça sert ?"

"Eh bien, il y en a deux. Premièrement, nous déclarons une variable comme final si nous voulons dire aux autres développeurs que cette valeur est une constante spécifique, et pas seulement une variable."

Par exemple, nous voulons calculer la taxe de vente en fonction d'un prix :

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"Et deuxièmement, nous avons besoin de ce type de variable lors de l'écriture de classes internes locales ou anonymes. Je vous parlerai bientôt de ces types de classes. Mais pas aujourd'hui."

"D'accord, jusqu'à présent, il n'y a rien eu de trop compliqué."

"Veuillez noter que seule la variable devient immuable, pas un objet auquel elle pourrait faire référence. L'objet peut toujours être modifié."

« J'étais en fait sur le point de poser une question à ce sujet. Et il n'y a aucun moyen de rendre l'objet inchangeable ?

"Non, sauf si vous écrivez une classe immuable."

"Veuillez noter que la valeur d'une variable finale ne pouvant être modifiée, vous devez attribuer sa valeur initiale immédiatement."

Ce code compilera Ce code ne compilera pas
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"Mais, cela dit, Java vous permet de retarder l'initialisation des variables finales d'une classe jusqu'au constructeur."

Ce code compilera Ce code ne compilera pas
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"De plus, différents constructeurs peuvent initialiser des variables finales avec des valeurs différentes. C'est très pratique :"

Ce code compilera
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"C'était un sujet vraiment intéressant, et absolument tout a un sens. Merci, Bilaabo!"