Quelques notions sur les objets

Encapsulation

Jusqu'à présent on a accédé librement à tous les champs et méthodes de la classe Boite depuis nos classes exécutables.

Cependant laisser les champs d'un objet en libre accès peut être une source de problèmes. Dans notre cas, nous nous assurons lors de la création d'une Boite qu'elle ait des dimensions positives, cependant rien n'empêche ensuite de modifier les champs profondeur, hauteur et largeur pour leur donner des valeurs négatives, ce qui peut ensuite donner pour volume() et surface() un résultat négatif.

Il vaudrait mieux pouvoir "cacher" les champs profondeur, largeur et hauteur, et créer des méthodes pour redimensionner la boite, qui pourront faire en sorte que ces champs restent positifs. C'est possible en utilisant le modificateur private dans la déclaration de ces champs dans le fichier Boite.java : l'usage de ces champs est alors réservé à la classe Boite. On dit qu'ils sont encapsulés dans la Boite.

private int profondeur,largeur,hauteur;

Si vous modifiez Boite.java ainsi et que vous compilez Cree1boite.java, vous obtiendrez des messages d'erreur car Cree1boite tente d'accéder aux champs hauteur, profondeur et largeur d'un objet Boite, qui sont privés.

Si on veut que les valeurs de ces champs puissent être lues ou modifiées par d'autres classes, il faut créer des méthodes pour cela.

//fichier Boite
class Boite{
private int profondeur,largeur,hauteur;
boolean pleine;

  ...
  
//methodes renvoyant les valeurs des champs privés hauteur, largeur, profondeur   
int getHauteur(){
        return hauteur;
		}
int getLargeur(){
        return largeur;
		}
int getProfondeur(){
        return profondeur;
		}
		
//methodes permettant de modifier les valeurs des champs privés hauteur, largeur, profondeur, en s'assurant qu'elles soient positives.		
void setHauteur(int p){
        hauteur=Math.abs(p);
		}
void setLargeur(int p){
        largeur=Math.abs(p);
		}
void setProfondeur(int p){
        profondeur=Math.abs(p);
		}			
}

//fichier Creeboitep
class Creeboitep{
public static void main(String[] args){
   Boite boitep1=new Boite(200,100,50,false);
   System.out.println("profondeur: "+boitep1.getProfondeur()); // affiche le résultat de la méthode getProfondeur() de boitep1, c'est à dire la profondeur de boitep1.
   System.out.println("largeur "+boitep1.getLargeur()); // de même pour la largeur
   System.out.println("hauteur: "+boitep1.getHauteur());// de même pour la hauteur 
  
   
   System.out.println("pleine: "+boitep1.pleine);
   System.out.println("volume: "+boitep1.volume());
   
   boitep1.setLargeur(80); // change la largeur de la boite
   boitep1.setProfondeur(120); //ainsi que sa profondeur
   boitep1.setHauteur(60); //et sa hauteur, en appelant les méthodes appropriées.
   System.out.println("volume: "+boitep1.volume()); // affiche le nouveau volume
  }
}

Remarque : les préfixes get et set sont quasi-sytématiquement utilisés pour nommer ce type de méthode dans les bibliothèques Java. Comme il n'y a pas vraiment d'équivalent pratique à utiliser en français, autant prendre l'habitude de les utiliser, même si cela donne des noms étranges !

Ecrivez une méthode "getAge" pour la classe Ami
Ecrivez une méthode "setAge" pour la classe Ami
 
Licence Creative Commons
licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé
Auteur : Nathalie Bonnin
Professeur de Physique, Chimie, Informatique au lycée La Martinière Monplaisir (Lyon 8ème)
Contact :
nathalie.bonnin (chez) scientillula.net
Licence Creative Commons
La totalité du contenu du site Scientillula.net appartient à Nathalie Bonnin et est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé