Le scope ou portée des variables en Java

Vous avez appris que les variables locales sont déclarées à l’intérieur d’un bloc de code. La compréhension de la portée des variables Java est essentielle pour écrire du code fiable et maintenable. Voyons combien de variables sont dans la portée de cette méthode :

public void manger(int morceauxFromage) {
    int bouchesFromage = 1;
}

Il y a deux variables avec une portée locale. La variable bouchesFromage est déclarée à l’intérieur de la méthode. La variable morceauxFromage est un paramètre de méthode. Aucune de ces variables ne peut être utilisée en dehors de leur zone de définition.

Limitation de la Portée des Variables

Les variables locales ne peuvent jamais avoir une portée plus grande que la méthode dans laquelle elles sont définies. Cependant, elles peuvent avoir une portée plus restreinte. Considérez cet exemple :

public void mangerSiFaim(boolean aFaim) {
    if (aFaim) {
        int bouchesFromage = 1;
    } // bouchesFromage sort de la portée ici
    System.out.println(bouchesFromage); // NE COMPILE PAS
}

La variable aFaim a une portée qui s’étend sur toute la méthode, tandis que la variable bouchesFromage a une portée plus restreinte. Elle n’est disponible que dans le bloc if car elle y est déclarée. Lorsque vous voyez des accolades ({}) dans le code, cela signifie que vous êtes entré dans un nouveau bloc de code. Chaque bloc de code a sa propre portée.

Gestion des Blocs Imbriqués

Rappelons que les blocs peuvent contenir d’autres blocs. Ces blocs plus petits peuvent faire référence aux variables définies dans les blocs de portée plus large, mais pas l’inverse. Voici un exemple :

public void mangerSiFaim(boolean aFaim) {
    if (aFaim) {
        int bouchesFromage = 1;
        {
            var petiteBouchee = true;
            System.out.println(bouchesFromage);
        }
    }
    System.out.println(petiteBouchee); // NE COMPILE PAS
}

La variable bouchesFromage reste en portée jusqu’à la fin du bloc if. C’est pourquoi nous pouvons l’utiliser sans problème dans le bloc plus petit (entre les accolades intérieures). En revanche, la variable petiteBouchee sort de portée dès la fin de son propre bloc, celui où elle a été déclarée. C’est la raison pour laquelle tenter de l’utiliser après ce bloc génère une erreur de compilation.

Suivi de la Portée des Variables

Voyons maintenant un exemple plus complexe qui vous aidera à maîtriser la portée des variables en Java. Ne vous inquiétez pas si vous n’êtes pas encore familier avec les instructions if ou les boucles while. Ce qui nous intéresse ici, c’est la portée des variables. Essayez de déterminer à quelle ligne chacune des cinq variables locales entre et sort de la portée :

public void mangerPlus(boolean aFaim, int quantiteNourriture) {
    int capaciteEstomac = 5;
    if (aFaim) {
        var tempsRepas = true;
        while (quantiteNourriture > 0) {
            int quantiteMangee = 2;
            capaciteEstomac = capaciteEstomac - quantiteMangee;
            quantiteNourriture = quantiteNourriture - quantiteMangee;
        } #1
    } #2
    System.out.println(quantiteNourriture);
} #3

Cette méthode compile correctement. La première étape pour comprendre la portée est d’identifier les blocs de code. Dans ce cas, il y a trois blocs, comme en témoignent les trois paires d’accolades. En commençant par l’ensemble le plus interne, nous pouvons voir où le bloc de la boucle while commence et se termine.

BlocPremière ligne du blocDernière ligne du bloc
whilewhile (quantiteNourriture > 0)} #1
ifif (aFaim)} #2
Méthodepublic void mangerPlus} #3

Analyse de la Portée des Variables

Maintenant que nous avons identifié les blocs, examinons la portée de chaque variable :

  • aFaim et quantiteNourriture sont des paramètres de méthode, donc disponibles dans toute la méthode
  • capaciteEstomac entre en portée à sa déclaration et reste disponible jusqu’à la fin de la méthode
  • tempsRepas entre en portée dans le bloc if et en sort à la fin de ce bloc
  • quantiteMangee entre en portée dans le bloc while et en sort à la fin de ce bloc

Application de la Portée aux Classes

Passons maintenant aux règles de portée pour les variables d’instance et de classe. La bonne nouvelle est que ces règles sont plus simples ! Les variables d’instance sont disponibles dès leur définition et le restent pendant toute la durée de vie de l’objet. Pour les variables de classe (marquées static), c’est encore plus simple : elles entrent en portée à leur déclaration et y restent pendant toute la durée d’exécution du programme.

Prenons un dernier exemple pour bien comprendre. Essayez d’identifier le type des quatre variables et leur portée :

public class Souris {
    final static int TAILLE_MAX = 5;
    int taille;
    
    public void grandir(int centimetres) {
        if (taille < TAILLE_MAX) {
            int nouvelleTaille = taille + centimetres;
            taille = nouvelleTaille;
        }
    }
}

Analyse des Variables de la Classe Souris

Dans cette classe, nous avons :

  • Une variable de classe : TAILLE_MAX
  • Une variable d’instance : taille
  • Deux variables locales : centimetres et nouvelleTaille

Résumé des Règles de Portée

Pour conclure, voici les règles essentielles de la portée des variables en Java :

  • Variables locales : En portée depuis leur déclaration jusqu’à la fin du bloc
  • Paramètres de méthode : En portée pendant toute la durée de la méthode
  • Variables d’instance : En portée depuis leur déclaration jusqu’à ce que l’objet soit éligible pour le ramasse-miettes
  • Variables de classe : En portée depuis leur déclaration jusqu’à la fin du programme