IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[optimisation de code] mot clé this et objet = null


Sujet :

Java

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Points : 74
    Points
    74
    Par défaut [optimisation de code] mot clé this et objet = null
    Bonjour messieurs je me pose des questions :

    Certaines personne sur le projet sur lequel je suis, on un code qui ne me parait vraiment bizard je ne comprends pas pourquoi ils font ça. Est-ce que quelqu'un peut me dire s’il s’agit d'une optimisation du code ou juste un code spécifique a certains développeurs ? :
    -Première interrogation est sur le mot clé this
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Kom {
     
    	/** L'ancienne valeur */
    	private String oldValue;
     
                 public void doplop() {
                     this.oldValue = "plop";
    	}
    J'aimerais juste savoir si c'est une convention ou alors si c'est une optimisation car perso je trouve ca moche j'utilise directement la variable sans le this.

    -Deuxième interrogation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Kom {
     
                 public void doplop() {
                  obj = null
                  // obj et obj2 sont de même type
                  obj = obj2
    	}
    C'est une optimisation de mettre l'objet a null avant de faire le passage par référence ?

    Merci d’avance.
    Cordialement.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    Je vais peut-être montre mon ignorance mais pour moi les deux exemples sont uniquement des questions de style. Je ne vois aucune optimisation à run-time.

    Dans l'exemple 1, le 'this' permet parfois de distinguer un champ d'un paramètre. L'exemple typique est le constructeur ou le setter:

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Malatok Voir le message
    -Première interrogation est sur le mot clé this
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Kom {
     
    	/** L'ancienne valeur */
    	private String oldValue;
     
                 public void doplop() {
                     this.oldValue = "plop";
    	}
    J'aimerais juste savoir si c'est une convention ou alors si c'est une optimisation car perso je trouve ca moche j'utilise directement la variable sans le this.
    C'est une convention. Dans cet exemple, elle est discutable.

    Regardons, par contre, cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
      private String value;
     
      public void setValue(String value) {
        this.value = value;
      }
    }
    Ici, la variable membre, et le paramètre de la méthode setValue(), portent le même nom. Java dit que dans ce cas-là, le nom du paramètre masque le nom de la variable membre.

    Pour accéder quand même à la variable membre, on utilise this.
    Ceci est une convention très répandue dans les setters.

    Citation Envoyé par Malatok Voir le message
    -Deuxième interrogation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Kom {
     
                 public void doplop() {
                  obj = null
                  // obj et obj2 sont de même type
                  obj = obj2
    	}
    C'est une optimisation de mettre l'objet a null avant de faire le passage par référence ?
    Je ne vois pas de "passage par référence."

    Assigner une valeur à une variable, puis lui assigner une autre valeur sans s'en être servi entre les deux, est inutile. Ça n'a pas d'effet et est ignoré par le compilateur.
    Dans cet exemple, donc, l'assignation à null n'a servi à rien.

    Mais dans des exemples plus complets, initialiser une variable à null avant de pouvoir en faire quelque chose, peut s'avérer nécessaire, ou au moins un raccourci sympathique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Points : 74
    Points
    74
    Par défaut
    Je ne vois pas de "passage par référence."
    Pas très parlant mon exemple mais la je parlais d'un objet que l'on met a null, et ensuite sur lequel on vient faire un passage par référence de obj2 vers obj1(copie du contenu de l’objet2 vers l’objet1 ). Est-ce que par hasard quand tu lui passe la valeur null le compilateur ne va pas directement construire l’objet avec le constructeur par défaut et donc ca va allez plus vite de faire la copie de l’obj2 vers l’obj1 que de faire tout en même temps ?

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Malatok Voir le message
    Pas très parlant mon exemple mais la je parlais d'un objet que l'on met a null, et ensuite sur lequel on vient faire un passage par référence de obj2 vers obj1(copie du contenu de l’objet2 vers l’objet1 ). Mais c’est vrai que la comme ca pas évident de comprendre.
    Ce n'est pas un "passage par référence" mais une "affectation". La seule "copie" qui est faite est celle de la référence. Il n'y a pas de copie du contenu des objets !!!



    Sinon le fait de mettre la valeur à null ne sert à rien ou presque.
    La seule utilité que je verrais ce serait pour éviter des OutOfMemoryException si l'objet référencé occupe une taille importante en mémoire, et qu'on voudrait le remplacer par un objet aussi grand... Mais c'est vraiment ultra-ultra spécifique...



    a++

    PS : Au passage l'optimisation ne se fait pas sur des "astuces" ou des "mot-clef", mais sur un choix algorithmiques et l’utilisation d'objets et de données approprié au besoin...

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Points : 74
    Points
    74
    Par défaut
    Ce n'est pas un "passage par référence" mais une "affectation". La seule "copie" qui est faite est celle de la référence. Il n'y a pas de copie du contenu des objets !!!
    Très juste les obj1 et obj2 pointe sur le même objet en mémoire.(Désoler je me suis un peu emballer ...).

  7. #7
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    En ce qui concerne la premiere question, parfois this est necessaire (comme deja dit) et parfois non. Dans tous les cas, c'est à chacun de decider s'il le met systématiquement ou non. En ce qui me concerne, je le met toujours parce que je trouve ca plus lisible. Mais ce n'est qu'une convention (qui ne change rien au niveau de l'execution ou bien sur le fichier .class obtenu)...

    Pour la 2e question, j'imagine que ce que tu veux savoir, c'est s'il y a un interet à initialiser d'abord à null puis à affecter un objet. S'il y en a 1, je ne le vois pas (d'ailleurs, il y a des chances qu'a la compilation, l'initialisation saute). Mais c'est parfois une habitude qu'on pris certains developpeurs qui viennent du c/c++ d'initialiser systematiquement les pointeurs pour eviter d'utiliser des pointeurs non initialisés. Ca peut aussi est un code qui a été retouché et qui a gardé ca... Mais concretement, ce n'est pas une optimisation...

  8. #8
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    L'affectation à null est parfois nécessaire. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void foo(boolean test) {
    		String str1;
    		String str2 = "...";
    		if (test) {
    			str1 = str2;
    		}
    		str1.length();
    	}
    Ce code ne compile pas car str1 n'a pas été initialisé et on ne peut donc pas invoquer la méthode length().

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par +Guilhem Voir le message
    L'affectation à null est parfois nécessaire. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void foo(boolean test) {
    		String str1;
    		String str2 = "...";
    		if (test) {
    			str1 = str2;
    		}
    		str1.length();
    	}
    Ce code ne compile pas car str1 n'a pas été initialisé et on ne peut donc pas invoquer la méthode length().
    Pas génial cet exemple. Si on initialise str1 à null, str1.length() générera un NullPointerException et puis c'est tout, c'est encore moins bien que ne pas compiler du tout.
    Je ne trouve pas de vrai exemple parlant sans m'enfoncer dans une certaine complexité. Il y a la fermeture des flux, à la rigueur, avant l'apparition de try-with-resource.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Il y a la fermeture des flux, à la rigueur, avant l'apparition de try-with-resource.
    Même pas... Je ne vois pas en quoi il faudrait faire une affectation à null. Le try/finally suffit amplement !


    a++

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Même pas... Je ne vois pas en quoi il faudrait faire une affectation à null. Le try/finally suffit amplement !
    Quand il y a une seule ressource à fermer, ok, mais quand il y en a plusieurs ça devient vraiment lourd sans une petite initialisation à null.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pas génial cet exemple. Si on initialise str1 à null, str1.length() générera un NullPointerException et puis c'est tout, c'est encore moins bien que ne pas compiler du tout.
    Je ne trouve pas de vrai exemple parlant sans m'enfoncer dans une certaine complexité. Il y a la fermeture des flux, à la rigueur, avant l'apparition de try-with-resource.
    C'était juste pour illustrer que parfois nous sommes obligés d'initialiser une variable à null.

    Remplace str1.length(); par bar(str1); (bar étant une méthode quelconque), ça revient au même, ça compilera pas et en initialisant str1 à null aucune exception n'est levée.

  13. #13
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Quand il y en a plusieurs, il est préférable d'empiler les try/finally. C'est plus sûr et plus court

    a++

  14. #14
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Même pas... Je ne vois pas en quoi il faudrait faire une affectation à null. Le try/finally suffit amplement !
    Bah pour prendre un exemple, si on ouvre un fichier et qu'on met son contenu dans un autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
          FileInputStream fis = null;
          FileOutputStream fos = null;
          try
          {
             fis = new FileInputStream("c:\\in.txt");
             fos = new FileOutputStream("c:\\out.txt");
     
             // On transfert de l'un vers l'autre avec un eventuel traitement
          }
          catch (Exception ex)
          {
             ex.printStackTrace();
          }
          finally
          {
             if (fis != null)
             {
                try
                {
                   fis.close();
                }
                catch (Exception ex)
                {
                   ex.printStackTrace();
                }
             }
             if (fos != null)
             {
                try
                {
                   fos.close();
                }
                catch (Exception ex)
                {
                   ex.printStackTrace();
                }
             }
          }
    Tu ferais comment sans initialiser à null?

  15. #15
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Pour moi, moins il y a de mots dans les sources et plus c'est lisible. Donc un "this." en trop ou une initialisation en trop, bin, c'est en trop

    Pour le "this", je préfère ne le mettre que quand il faut (rarement, donc...), ainsi ça met en évidence l'endroit où il pourrait y avoir confusion. Pour le null, il me semble que dans les specs, un objet non initialisé est toujours null, non ?
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  16. #16
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    L'initialisation à null n'est vraie que pour les variables d'instance.
    Les variables locales d'une méthode doivent être initialisées avant d'être utilisées.

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BenWillard Voir le message
    Pour le null, il me semble que dans les specs, un objet non initialisé est toujours null, non ?
    C'est seulement vrai pour les attributs.

    Une variable locale non-initialisé provoquera une erreur de compilation si on tente d'y accéder sans qu'elle ne soit spécifiquement initialisé...


    Citation Envoyé par hwoarang Voir le message
    Bah pour prendre un exemple, si on ouvre un fichier et qu'on met son contenu dans un autre :
    Cette syntaxe est assez lourde à cause des multiples try/catch.
    De plus il n'est pas aisé de laisser remonter l'exception (parce qu'un printStackTrace() à ce niveau n'est peut-être pas le meilleur choix).
    Citation Envoyé par hwoarang Voir le message
    Tu ferais comment sans initialiser à null?
    En utilisant un bloc try/finally par ressource.
    Et si on a besoin de traiter les exceptions on rajoute un try/catch...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	try {
    		FileInputStream fis = new FileInputStream("c:\\in.txt");
    		try {
    			FileInputStream fos = new FileOutputStream("c:\\out.txt");
    			try {
    				// On transfert de l'un vers l'autre avec un eventuel traitement
    			} finally {
    				fos.close();
    			}
    		} finally {
    			fis.close();
    		}
    	} catch (IOException e) {
    		e.printStrackTrace();
    	}
    C'est grosso-modo le pattern adopté par le try-with-resources de Java 7...


    a++

  18. #18
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Une variable locale non-initialisé provoquera une erreur de compilation si on tente d'y accéder sans qu'elle ne soit spécifiquement initialisé...
    Dans ma config, ça me donne un warning ...
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  19. #19
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BenWillard Voir le message
    Dans ma config, ça me donne un warning ...
    C'est quoi ta config ? javac provoquera une erreur quoi qu'il arrive.

    a++

  20. #20
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Ma config c'est Eclipse, avec une config perso des erreurs de compil...

    Mais en fait ça me donne un warning pour "potential null pointer access"...

    Si j'initialise un truc dans la partie "try" du "try-catch", et pas dans le catch, et l'utilise plus tard, je n'ai aucune erreur à la compil, il me semble.

    T'as pas un exemple ? que je puisse tester précisément.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

Discussions similaires

  1. Objet de transition / Optimisation de code
    Par Feriaman dans le forum C++
    Réponses: 4
    Dernier message: 20/12/2006, 10h11
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo