Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quand utiliser le mot clé this

this

Sujet résolu
    19 février 2017 à 10:49:44

    Bonjour j'ai un petit problème concernant le mot-clé "this".
    Je sais qu'il permet de représenter l'objet courant, donc les variables et les méthodes de la classe, mais je ne sais pas vraiment à quoi cela peut-il servir et surtout quand l'utiliser? C'est à dire quelles variable et méthode en auront besoin ou non ?
    Il y a du code avec le mot clé this:
    public class Ville {
     
      private String nomVille;
      private String nomPays;
      private int nbreHabitants;
      private char categorie;
       
      public Ville(){
        System.out.println("Création d'une ville !");          
        nomVille = "Inconnu";
        nomPays = "Inconnu";
        nbreHabitants = 0;
        this.setCategorie();
      }
     
      public Ville(String pNom, int pNbre, String pPays)
      {
        System.out.println("Création d'une ville avec des paramètres !");
        nomVille = pNom;
        nomPays = pPays;
        nbreHabitants = pNbre;
        this.setCategorie();
      }  
        
      //Retourne le nom de la ville
      public String getNom()  {  
        return nomVille;
      }
    
      //Retourne le nom du pays
      public String getNomPays()
      {
        return nomPays;
      }
    
      // Retourne le nombre d'habitants
      public int getNombreHabitants()
      {
        return nbreHabitants;
      } 
    
      //Retourne la catégorie de la ville
      public char getCategorie()
      {
        return categorie;
      } 
     
      //Définit le nom de la ville
      public void setNom(String pNom)
      {
        nomVille = pNom;
      }
    
      //Définit le nom du pays
      public void setNomPays(String pPays)
      {
        nomPays = pPays;
      }
    
      //Définit le nombre d'habitants
      public void setNombreHabitants(int nbre)
      {
        nbreHabitants = nbre;
        this.setCategorie();
      }  
     
      //Définit la catégorie de la ville
      private void setCategorie() {
     
        int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};
        char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
    
        int i = 0;
        while (i < bornesSuperieures.length && this.nbreHabitants > bornesSuperieures[i])
          i++;
    
        this.categorie = categories[i];
      }
    
      //Retourne la description de la ville
      public String decrisToi(){
        return "\t"+this.nomVille+" est une ville de "+this.nomPays+ ", elle comporte : "+this.nbreHabitants+" habitant(s) => elle est donc de catégorie : "+this.categorie;
      }
    
      //Retourne une chaîne de caractères selon le résultat de la comparaison
      public String comparer(Ville v1){
        String str = new String();
    
        if (v1.getNombreHabitants() > this.nbreHabitants)
          str = v1.getNom()+" est une ville plus peuplée que "+this.nomVille;
         
        else
          str = this.nomVille+" est une ville plus peuplée que "+v1.getNom();
         
        return str;
      }
    }
    J'ai essayé d'enlever le mot "this" dans les méthodes "comparer", "decrisToi" et également dans le mutateur "setCategorie"
    excepté pour les constructeurs et pour le code ci-dessous, il fallait obligatoirement laisser "this".
    this.categorie = categorie[i] // obligatoire
    Par conséquent avec ces enlèvements le code compile bien et m'affiche bien ce que je veux. 
    C'est pour sa que je ne comprend pas son utilité.
    Voila merci de m'éclaircir et vos réponses , Cordialement. Sam
    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2017 à 18:10:49

      Le mot clé this permet entre autre de ne pas confondre deux variables avec le même nom, une en dehors de la classe et une autre à l'intérieur
      • Partager sur Facebook
      • Partager sur Twitter

      Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.

        19 février 2017 à 20:54:04

        Superbowy a écrit:

        Le mot clé this permet entre autre de ne pas confondre deux variables avec le même nom, une en dehors de la classe et une autre à l'intérieur


        Voilà exactement la réponse :D . N'oublie pas de mettre le sujet en " Résolu " ;)
        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2017 à 8:41:25

          Superbowy a écrit:

          Le mot clé this permet entre autre de ne pas confondre deux variables avec le même nom, une en dehors de la classe et une autre à l'intérieur

          Non, il ne sert pas à ça. Il sert avant tout à avoir une référence vers l'objet courant. Il même bien plus pertinent de ne pas utiliser le mot clé this pour ça, car ce n'est pas du tout robuste à un refactoring ou une maintenance dans le code. Exemple concret :

          class Machin{
            private int a;
          
            Machin(int a){
              this.a = a;
            }
          }

          Maitenant quelqu'un change le nom du paramètre "a" pour le rendre plus explicite :

          class Machin{
            private int a;
          
            Machin(int valeur_de_saut){
              this.a = a;
            }
          }

          Mais oublie de modifier le code (ce qui peut arriver). Tu n'auras aucun message d'erreur du compilateur et l'erreur sera difficile à saisir. Alors qu'avec un nommage différent dès le départ. Par exemple _var ou m_var, pour les attributs de la classe, la différenciation ne pouvait pas entraîner ce genre de problème.

          La vrai utilité du mot clé this va plutôt se trouver dans des usages comme :

          class A{
            public void foo(){}
            public void bar(B b){
              b.foobar(this);
            }
          }
          
          class B{
            public void foobar(A a){
              a.foo();
            }
          }

          A savoir la capacité à donner à quelqu'un une référence vers l'objet courant.

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            23 février 2017 à 22:32:14

            Si, il sert entre autres à ca.. quant à oublier de modifier son code, déjà c'est une mauvaise idée d'avoir deux variables de même nom, mais oublier... Bref. Je suis d'accord avec la deuxième partie, c'est pour ça que j'avais mis "entre autres"
            • Partager sur Facebook
            • Partager sur Twitter

            Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.

              24 février 2017 à 8:21:19

              Superbowy a écrit:

              Si, il sert entre autres à ca.. quant à oublier de modifier son code,

              Bienvenue dans le monde réel, les erreurs d'inattentions, c'est l'erreur par excellence de l'humain et ça représente une source non négligeable de bugs dans un programme. Évidemment dans cet exemple, on parle de 5 lignes de codes, bref, pas du vrai cod. Mais le refactoring et la maintenance peuvent créer de vilaines surprises qu'il vaut mieux prévenir que guérir.

              Superbowy a écrit:

              déjà c'est une mauvaise idée d'avoir deux variables de même nom, mais oublier...

              D'autres part, si tes variables n'ont pas le même nom, tu n'as pas besoin de this, qui pollue juste la lecture de ton code avec des mentions inutiles à l'objet courant. D'où mon message : n'utilisez le mot clé this que pour filer des références à vers soi même à un autre objet, et pas pour désambiguïser des noms. CQFD.

              -
              Edité par Ksass`Peuk 24 février 2017 à 8:30:47

              • Partager sur Facebook
              • Partager sur Twitter

              Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                24 février 2017 à 10:32:38

                Hello, 

                juste parsque je sais que tu aimes bien chipoter Ksass (et à raison !), en Java la convention de nommage n'est pas valeur_de_saut mais valeurDeSaut.

                Voilà désolé pour cette intervention HS.

                PS : Ce n'est pas parsque le tuto Java d'OC vous montre le  this.a = a; qu'il faut le faire. Ksass`Peuk a raison, c'est très chiant quand on veux renommer une variable dans le code (pas d'erreurs dans l'IDE, pas la possibilité de faire du chercher remplacer...). Utilisez le juste pour faire un bon vieux maFonction(this); 

                Bye ;)

                -
                Edité par arno21 24 février 2017 à 10:36:03

                • Partager sur Facebook
                • Partager sur Twitter

                Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

                  24 février 2017 à 10:45:29

                  arno21 a écrit:

                  juste parsque je sais que tu aimes bien chipoter Ksass (et à raison !), en Java la convention de nommage n'est pas valeur_de_saut mais valeurDeSaut.

                  C'est vrai, je suis pas habitué aux langages qui donnent direct des conventions de nommage autres que "ne nommez pas ça comme ça, on l'a réservé pour l'implémentation du langage".

                  arno21 a écrit:

                  Utilisez le juste pour faire un bon vieux maFonction(this);

                  C'est des méthodes en Java :p .

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                    26 février 2017 à 17:30:16

                    Coucou tout le monde, merci beaucoup de vos réponses. C'est déjà un petit peu plus clair en ce qui concerne son utilité.

                    Cordialement, sam

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Quand utiliser le mot clé this

                    × 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