Constructeurs

images/whitebelt.png

Notons que, si l’on suit le mode opératoire de l’exemple précédent, l’allocation/initialisation d’un simple aggrégat de données est une opération fastidieuse. De plus elle a l’inconvénient de laisser un objet dans un état intermédiaire incomplètement initialisé (ce qui peut s’avérer dangereux par ex. si un autre thread d’exécution en profite pour utiliser cet objet).

        Versement op1, op2 ; // declaration de 2 references
   // allocations  (utilisation du constructeur "par défaut" -sans arguments-)
        op1 = new Versement() ;
        op2 = new Versement() ;
   // initialisations des membres de chaque instance

Bien que Versement soit un type "simple" on pourrait améliorer sa définition en le dotant d’opérations d’allocation/initialisation.

Cette opération globale définie dans un code constructeur a également l’avantage de ne pas laisser un objet dans un état "larvaire": à la sortie du code constructeur on dispose d’une référence vers un objet complètement initialisé.

Une classe avec un constructeur. 

public class Versement {
   double valeur ;
   String monnaie ;
   long heureOperation ;

   // definition d'un constructeur
   Versement(double val, String monn, long heure) {
      this.valeur = val ;
      this.monnaie = monn ;
      this.heureOperation = heure ;
   }
}

Noter que dans le code les variables membres sont référencées en utilisant this

Un code utilisant un constructeur. 

public class TestVersement2 {
    public static void main(String[] args) {
      long maintenant = System.currentTimeMillis() ; //donne l'heure
       Versement op = new Versement(10.99, "GBP", maintenant) ;
    }
}

[Avertissement]

Une fois qu’on a défini un constructeur explicite on ne peut plus utiliser le constructeur par défaut (new Versement()). Il est toutefois possible de définir explicitement un constructeur sans paramètres (et dans ce cas new Versement() redeviendrait légal).

--exercice--