Partage
  • Partager sur Facebook
  • Partager sur Twitter

Constructeur de copie en Java

    17 janvier 2016 à 12:45:20

    Bonjour à tous,

    Je suis entrain de travailler sur un exercice et je rencontre des incohérences entre le résultat de mon code et les résultats attendus dans l'énoncé. J'ai en fait un doute sur l'implémentation de mes constructeurs.

    Voici l'énnoncé:

    Les méthodes qui sont spécifiques à cette classe et font partie de son interface d'utilisation sont :

    • un constructeur initialisant le plan d'étude au moyen d'une copie d'un StudyPlan passé en paramètre ;

    • un constructeur de copie initialisant le plan d'étude au moyen d'une copie du plan d'étude du Schedule passé en paramètre ; et l'ensemble des identifiants de cours au moyen d'une copie de l'ensemble d'identifiants du Schedule passé en paramètre ;

    Voici le code que j'ai écris:

    import java.util.ArrayList;
    
    
    public class Schedule {
    
    	private ArrayList<String> id_cours= new ArrayList<String>();
    	private StudyPlan studyplan = new StudyPlan();
    
    	public Schedule(StudyPlan studyPlan) {
    		this.studyplan = studyPlan;
    	}
    
    	public Schedule(Schedule schedule) {
    		this.id_cours = schedule.id_cours;
    		this.studyplan = schedule.studyplan;
    	}
    
    	public boolean addCourse(String idCours) {
    		boolean conflit = studyplan.conflicts(idCours, id_cours);
    
    		if (conflit == false)
    		{
    			id_cours.add(idCours);
    			return true;
    		}
    		return false;
    	}
    
    	public double computeDailyWorkload(){
    		double chargeTotal = 0;
    		for (String cours: id_cours){
    			double charge = studyplan.workload(cours);
    			chargeTotal = chargeTotal + charge;
    		}
    		return chargeTotal / 5;
    	}
    	
    	public int computeTotalCredits(){
    		int creditTotal = 0;
    		for (String cours: id_cours){
    				int credit = studyplan.credits(cours);
    				creditTotal = creditTotal + credit;
    			}
    		return creditTotal;
    	}
    	
    	public void print() {
    		for (String cours: id_cours){
    			studyplan.print(cours);
    		}
    		int credit = computeTotalCredits();
    		System.out.println("Total de crédits :" + credit);
    		double charge = computeDailyWorkload();
    		System.out.println("Charge journalière :" + charge);
    		System.out.println("Suggestions :");
    		studyplan.printCourseSuggestions(id_cours);
    		System.out.println();
    	}
    
    }
    


    Est-ce que mes constructeurs Schedulle () sont cohérents avec l'énnoncé?

    Merci pour votre aide.

    Cordialement,

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2016 à 15:52:33

      bonjour, les propriétés de ta classe sont 'private', tu ne peux pas y accèder en faisant schedule.id_cours et schedule.studyplan.
      tu dois créer des getters pour accèder à ces propriétés…

      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2016 à 19:01:56

        Le problème vient comme dis au dessus des getteurs / setteurs de ta classe Schedulle.

        Mais tu peux améliorer plusieurs chose dans ton code également :

        Ligne 7 : Quand tu créer ta variable studyplan, cela ne sert à rien de créer un study plan puisque tu vas lui assigner un studyplan dans tout les cas par la suite.

        Dans ta fonction addCourse(), ce n'est pas très propre de faire plusieurs return, je te conseil d'initialiser un booléen, res = false, au début de ta fonction, et de passer res à true, si il n'y a pas de conflit et seulement à la fin tu retourne res.

        • Partager sur Facebook
        • Partager sur Twitter
          18 janvier 2016 à 9:28:14

          reezrd a écrit:

          bonjour,
          les propriétés de ta classe sont 'private', tu ne peux pas y accèder en faisant schedule.id_cours et schedule.studyplan.

          tu dois créer des getters pour accèder à ces propriétés…


          Je t'encourage à tester, mais c'est autorisé. Le mot clef private restreint l'accès à la classe, pas à l'objet. Ça peut être utile dans la méthode equals par exemple, si tu dois tester l'égalité de deux membres marqué private et qui n'ont pas de getter.

          Le problème de ton constructeur par recopie ici, c'est que tu recopies les références de ton objet, et que tu ne fais pas une copie en profondeur.

          public Schedule(Schedule schedule) {
              // La tu recopies en profondeur ta liste
              this.id_cours = new ArrayList<String>();
              for(String s : schedule.id_cours)
                   this.id_cours.add(s);
              
              // La il te faut un constructeur par recopie de ton StudyPlan également
              this.studyplan = new StudyPlan(schedule.studyplan);
          }



          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2016 à 18:45:28

            Merci à tous pour vos réponses.

            J'ai modifié mon code pour l'adapter à ce que vous m'aviez proposé. Mais j'ai toujours le problème en question.
            Ce problème ne vient donc pas de là...Je dois regarder ailleurs dans le code.

            Merci en tout cas...

            • Partager sur Facebook
            • Partager sur Twitter

            Constructeur de copie en Java

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown