Apprendre la programmation avec Java

Portée des variables

Chaque variable n’est disponible (et accessible) que dans le contexte dans lequel elle a été déclarée. Pour déterminer le contexte, reportez-vous aux marques d’ouverture et de fermeture les plus proches qui entourent la déclaration. La plupart des langages de programmation utilisent des accolades ({}) pour marquer le début et la fin d’un bloc de code. Découvrez cet exemple:

Portée d’une variable

Il n’est pas nécessaire de comprendre chaque bit de code ici; concentrez-vous simplement sur les accolades. 🙂 Lorsque nous parlons de la disponibilité d’une variable dans un contexte, nous faisons référence à la portée. Ici, vous pouvez voir que la variable root a été déclarée entre les deux accolades cerclées de violet. La portée de cette variable est tout entre ces deux accolades.

La portée d’une variable peut être locale ou globale, selon l’endroit où une variable est déclarée. Une variable globale peut être disponible pour toutes les classes et méthodes d’un programme alors qu’une variable locale peut être disponible uniquement dans la méthode dans laquelle elle est déclarée :

Portée locale vs globale

Ici, nous avons un peu élargi le code et étendu notre premier bloc de code pour en inclure un autre! Si vous tracez les lignes violettes, vous pouvez voir que les crochets du premier bloc englobent tout le code du second. Ensuite, vous pouvez voir qu’une nouvelle variable, spy, a été déclarée dans la portée locale verte.

Étant donné que la variable root a été déclarée dans la portée globale, cela signifie qu’elle est accessible à tout ce qui se trouve entre parenthèses violettes, y compris tout ce qui est déclaré dans la portée locale. Dans le deuxième bloc de code, vous pouvez voir une ligne juste en dessous de la déclaration de variable spy qui utilise root. C’est permis !

Cependant, tout ce qui se trouve dans la portée locale n’est pas disponible pour la portée globale, ni pour tout autre bloc de code local. Jetons un coup d’œil à un autre exemple:

Portées multiples

Ici, nous avons ajouté un autre bloc de code, qui a sa propre portée locale et sa propre variable, anotherSpy. Maintenant, consultez la dernière ligne de notre bloc de variables d’espionnage:

System.out.println(anotherSpy); // Error

On dirait qu’il y a une erreur! C’est parce qu’il essaie d’utiliser la variable anotherSpy. Mais cela ne peut pas parce que anotherSpy n’est ni dans la portée globale ni dans la même portée locale. Cela signifie que ce bloc de code ne peut pas y accéder. anotherSpy n’est disponible que dans le bloc de code dans lequel il a été déclaré.

La même chose est vraie dans l’autre sens. Vous pouvez voir que la dernière ligne de notre dernier bloc de code comporte également une erreur:

System.out.println(spy); // Error

Ici, il essaie d’utiliser la variable spy à partir d’un autre bloc de code. Mais il ne peut pas car spy n’est pas dans la même portée que le bloc de code qui essaie de l’utiliser.

Portée de la variable dans les classes

Lorsque vous déclarez une classe, les mêmes règles générales de portée s’appliquent : chaque variable n’est accessible que dans son bloc de déclaration. Expérimentons avec une classe unicorn:

Classe unicorn

Tout comme dans notre premier exemple, il existe des variables de classe globales ainsi que des variables locales. Passons en revue en détail:

  • Les variables height et power sont des champs de la classe et sont accessibles n’importe où dans la classe.

  • La variable minutesToSleep n’est accessible que dans la portée locale du bloc de code dans lequel elle est déclarée.

  • La variable minutesToRun n’est accessible que dans la portée locale du bloc de code dans lequel elle est déclarée.

La portée d’une variable limite son accessibilité par définition. Cependant, les champs de classe sont accessibles en dehors de la classe et peuvent être utilisés par tout autre bloc de code.

Dans notre exemple, ce sont height et power. Si nous déclarons une variable Unicorn, nous pouvons lire ou modifier ces valeurs:

Être capable de jouer avec des variables de classe peut avoir de graves conséquences. La bonne nouvelle est que vous pouvez contrôler cela! Avant de vérifier comment, assurez-vous de pratiquer avec une portée variable.

Essayez-le par vous-même!

Contrôle d’accès

Nous allons utiliser l’idée du contrôle d’accès en implémentant un accès restreint à une classe, un module ou un fichier. Vous savez déjà ce qu’est une classe et un fichier depuis que nous travaillons avec eux!

Un module est un ensemble de fichiers sources associés à un nom, comme un framework. Un framework est un ensemble de fonctionnalités regroupées par contexte particulier. Il accélère le processus de développement et fournit des conseils sur la façon d’écrire le code.

Il existe un certain nombre de cadres fournis par chaque environnement de développement. Le fait est que la mise en œuvre de ces frameworks va bien au-delà de ce que les développeurs qui les utilisent peuvent voir et utiliser. Cela se fait en limitant l’accès aux détails de la mise en œuvre, également appelée implémentation du contrôle d’accès.

Niveaux de contrôle

En Java, il faut utiliser l’un des mots-clés pour désigner un niveau de contrôle :

  • Public : visible pour le monde et donc le moins restrictif

  • Protected : visible pour le paquet et toutes ses sous-classes

  • Package-protected: généralement visible uniquement par le paquet dans lequel ils se trouvent (paramètres par défaut)

  • Privé : uniquement accessible dans le contexte dans lequel ils sont définis (à l’intérieur de la classe où ils se trouvent)

La mise en place de ces restrictions distinctes facilite le développement. Vous n’avez pas à vous soucier de la visibilité indésirable de votre implémentation et plus encore, des modifications indésirables.

Placez un mot-clé approprié devant la déclaration associée:

Ensuite, si vous essayez d’accéder à des membres privés depuis l’extérieur de la classe, vous obtenez des erreurs:

Les niveaux de contrôle peuvent être affectés aux éléments de classe ainsi qu’aux classes :

public class PublicClass {}private class PrivateClass {}

En plus de la sécurité, la spécification des niveaux de contrôle pour les membres de la classe offre une meilleure lisibilité. Lorsqu’un développeur prépare un fichier source, il est toujours clair quels éléments peuvent être utilisés en externe.

Hiérarchie de contrôle

Un élément peut avoir le même niveau de contrôle ou un niveau de contrôle plus restrictif que son élément contenant :

Dans l’exemple ci-dessus, la classe est déclarée comme public. Étant donné que la classe est l’élément contenant, cela signifie que tous les éléments de cette classe peuvent avoir le même niveau d’exposition ou un niveau d’exposition moindre. Dans ce cas, il comprend tous les niveaux.

Si vous déclarez une classe en tant que private, ses éléments ne peuvent être que package-private ou private:

 class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}

Dans l’exemple ci-dessus, nous avons ajouté un attribut sans mot clé de contrôle d’accès explicite. Dans ce scénario, par défaut, il suppose le niveau de l’élément contenant. Dans ce cas, c’est notre classe, donc elle suppose le niveau de PrivateClass.

Une classe de niveau supérieur ne peut pas être marquée private, mais la définir par défaut la placera dans le niveau protégé par le paquet. Lors de la déclaration d’une variable d’une classe, si le niveau de contrôle du contexte de déclaration est supérieur à celui de la classe, la variable doit également avoir un niveau de contrôle explicite. Déclarons une variable FileprivateClass:

String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok

Comme vous pouvez le voir, si le niveau d’accès par défaut du contexte de la variable est supérieur à une classe que vous lui attribuez, vous devez spécifier explicitement le niveau de la variable comme étant identique ou inférieur à celui de la classe.

Résumé

Dans ce chapitre, vous avez appris l’accessibilité des variables :

  • Une portée d’une variable est la zone de code où elle a été déclarée.

  • La portée générale de la variable s’applique à tous les blocs de code, y compris les classes.

  • Une autre façon nécessaire de contrôler l’accès aux variables et aux fonctions consiste à utiliser les niveaux de contrôle : public, protégé, protégé par package et privé.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.