Mot clé private

Champs privés d'une classe

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Le concept d'encapsulation en Java est l'une des bases que les développeurs devraient respecter. PHP jusqu'à sa version 5 implémentait plus le paradigme fonctionnel qu'objet. Mais depuis les développeurs se sont mis à la programmation orientée objet dont l'aspect d'encapsulation est fondamental.

Si l'on pense à l'encapsulation, on a automatiquement l'image des getters et setters qui rajoutent un niveau d'abstraction supplémentaire aux attributs d'une classe. Grâce à eux, on peut mieux contrôler le traitement de données et les résultats retournés au programme. Regardons un code sans eux pour comprenre ses utilités :

afficher le code

Voici le résultat affiché sur l'écran :

An error occured : your name must have at least 3 caracters
favoriteColors HashMap : {g=green}
copied HashMap : {g=green}
An error didn't occur : your name can have less than 3 caracters

Qu'est-ce qu'on voit ? Au tout début on remarque la condition sur l'attribut name qui devrait être définie directement au moment de précision de la valeur. Ensuite on voit bien la manipulation mal faite sur la map favoriteColors. Elle devrait devenir un objet immuable en Java. Mais à la place de cela, elle a été accidentellement modifiée par l'attribut local copied. Le troisième remarque concerne la classe-fille, WithoutGettersChild et son attribut name. Cette classe, contrairement à son parent, accepte qu'il possède moins que 3 caractères.

Regardons maintenant comment se présente la classe qui implémente correctement les getters et setters, et permet en même temps de répondre aux demandes définies ci-dessus :

afficher le code

Regardons maintenant le résultat :

An Exception occured on setting "name" : An error occured : your name must have at least 3 caracters
favoriteColors HashMap : {g=green, r=red}
copied HashMap : {g=green}

Pourquoi utiliser getters et setters en Java ?

L'utilisation des getters et setters, appelés également méthodes accessors et mutators, est donc très utile pour aider le code à évaluer plus facilement. On peut distinguer quelques avantages précis de l'implémentation de ces méthodes en Java :

  1. L'encapsulation renforcée : comme on a pu le constater avec la classe WithGetters, le contrôle sur l'attribut name est fait dans un seul endroit. Et s'il change un jour, on n'a qu'à modifier cet endroit pour que la modification soit prise en compte.
  2. Lazy loading implémenté : les attributs sont initialisés juste au moment où en a besoin. Le système n'utilise pas de ressources pour créer des objets inutiles.
  3. Java Beans : les getters et setters sont une des conditions pour qu'un objet Java devienne un Bean.
  4. Gestion plus simple des objets : comme dans notre exemple avec la map immuable, on peut vouloir utiliser une copie de l'objet pour effectuer certaines opérations sans affecter l'instance de l'origine. Le moyen le plus simple est le clonage de l'objet Java via un getter.
  5. Stabilité du programme : les accessors et mutators améliorent la stabilité de l'application. En fait la modification d'une méthode influence le fonctionnement du programme dans son ensemble. Il n'y a pas de situation où développeur pourrait louper un fragment de code à modifier.
  6. Cependant, un piège à éviter est surutilisation des setters. On peut imaginer le code suivant :

    private double weight;
    public void setWeight(double w) {
        weight = w;
    }
    
    public double getWeight() {
        return weight;
    }
    
    // calls from outside
    diet.setWeight(30.4d);
    diet.setWeight(diet.getWeight() + 0.5d);
    

    On peut considérer que ce code est peu lisible. A la place de se limiter à un getter et un setter, on pourrait définir une nouvelle méthode : putNewWeight(), comme ici :

    public void putNewWeight(double w) {
        weight = weight + w;
    }
    // calls from outside
    diet.setWeight(30.4d);
    diet.putNewWeight(0.5d);
    

    Le deuxième code est beaucoup plus clair aussi bien pour quelqu'un qui l'a écrit que pour quelqu'un qui le lit pour la première fois.

Bartosz KONIECZNY Informations sur le langage

Une question ? Une remarque ?

*

*

Un conseil Zend Framework

Comment faciliter le travail entre notre application et l'Ajax ?

L'un des moyens est l'utilisation du ContextSwitch. Il permet de définir le type de réponse renvoyé.