Programmation Java/Bloc de portée

Dans le code des méthodes, il est possible de créer des blocs de code entre accolades sans aucune construction spécifique avant (if, while, déclaration de méthode, ...). De tels blocs sont des blocs permettant de limiter la portée des variables.

Ce chapitre explique son utilité à travers différentes utilisations possibles.

Réutilisation de noms de variables

modifier

La limitation de la portée permet de réutiliser les noms de variables.

Exemple :

public double unCalculComplexe(double montant, int duree, double taux)
{
	{
		double total = coutTotalSurUnAn(montant, taux); // (1)
		if (total > 50000) taux = taux * 0.94;
	}
	// La variable total (1) devient hors de portée.
	// On peut réutiliser le nom de variable total :
	double total; // (2)
    total = coutTotalSur(duree, montant, taux); // (2)
	// ...
	return total;
}

L'ordre peut avoir de l'importance comme dans l'exemple suivant :

public double unCalculComplexe(double montant, int duree, double taux)
{
	double total; // (1)
	{
		double total = coutTotalSurUnAn(montant, taux); // (2)
		// ^ erreur de compilation ici car la variable total (2)
		//   est en conflit avec total (1) qui est toujours à portée.
		if (total > 50000) taux = taux * 0.94;
	}

    total = coutTotalSur(duree, montant, taux); // (1)
	// ...
	return total;
}

Restreindre la portée d'une variable

modifier

Restreindre la portée d'une variable en encadrant le bloc de code sensé être le seul à l'utiliser permet de tester que c'est le cas. Cela permet ensuite, par exemple, de déplacer ce bloc dans une méthode séparée pour le réutiliser.

public void uneMethodeAScinder()
{
	// ...
	{
		int nombre_de_pixels;
		// ...code déplaçable dans une méthode...
	}
	// Le code ci-dessous ne peut utiliser la variable nombre_de_pixels
	// devenue hors de portée et ne dépend donc pas de celle-ci.
	// ...
}

Réduire la quantité de pile utilisée

modifier

Les variables qui deviennent hors de portée libère immédiatement de l'espace pour d'autres variables locales dans la pile. Il est évidemment non recommandé d'avoir beaucoup de variables locales. Cependant réduire la quantité de pile est important pour les méthodes récursives : chaque nouvel appel prend une quantité importante de pile.

Réduire la quantité de mémoire utilisée

modifier

L'espace mémoire occupé par les objets alloués et référencés uniquement par les variables d'un bloc devient libérable quand ces variables deviennent hors de portée.

Exemple : Génération de plusieurs images

public void genererCartes(double longitude, double latitude)
{
	{
		int[] pixels = genererCarteZone(longitude-0.5, longitude+0.5, latitude-0.5, latitude+0.5);
		ecrireImage(new File(repertoire, "carte_gloable.png"), pixels);
	}
	// La variable pixels devient hors de portée.
	// Le tableau référencé devient libérable si la méthode ecrireImage et les méthodes
	// qu'elle appelle n'ont conservé aucune référence au tableau après utilisation.
	// Le garbage collector peut libérer la mémoire si besoin avant d'allouer le tableau
	// pour l'image ci-dessous.
	{
		int[] pixels = genererCarteZone(longitude-0.01, longitude+0.01, latitude-0.01, latitude+0.01);
		ecrireImage(new File(repertoire, "carte_detaillée.png"), pixels);
	}
}