46 votes

En Java, quelle est la différence entre this.method() et method() ?

Y a-t-il une différence entre appeler this.method() et method() (y compris la différence de performance) ?

60voto

Peter Lawrey Points 229686

La seule fois où cela est important est si vous utilisez OuterClass.this.method() par exemple

class OuterClass {
    void method() { }

    class InnerClass {
        void method() {
            OuterClass.this.method(); // not the same as method().
        }
    }
 }

28voto

Tomasz Nurkiewicz Points 140462

Il n'y a absolument aucune différence entre ces constructions et le bytecode généré sera exactement le même, d'où un impact nul sur les performances. this est résolu pendant la compilation s'il n'est pas explicitement défini.

La seule raison d'utiliser des this est la lisibilité - certaines personnes trouvent qu'il est plus facile à lire parce que this suggère qu'il s'agit d'une méthode d'instance de l'objet courant.

Veuillez également noter que si method() est statique, en utilisant this est découragée et trompeuse.

private static void method() {
}

private void foo() {
    this.method();    //generates warning in my IDE for a reason
}

Et dans ce cas, cela n'aura également aucun effet sur les performances.

18voto

Atreys Points 2234

On peut constater qu'il n'y a pas de différence en appelant javap -c ClassName sur la ligne de commande. Par exemple :

public class This {
    private void method() {
    }
    public void noThis() {
        method();
    }
    public void useThis() {
        this.method();
    }
}

Produit la sortie désassemblée suivante :

Compiled from "This.java"
public class This extends java.lang.Object{
public This();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void noThis();
  Code:
   0:   aload_0
   1:   invokespecial   #2; //Method method:()V
   4:   return

public void useThis();
  Code:
   0:   aload_0
   1:   invokespecial   #2; //Method method:()V
   4:   return

}

5voto

Chris Knight Points 7946

Pour les méthodes, il n'y a pas de différence, mais cela peut faire une différence avec les champs. Considérez ce code :

private String someObject = "some value";

public String someMethod(String someObject) {
     //this.someObject refers to the field while
     //someObject refers to the parameter
}

2voto

David Tanzer Points 1037

Il n'y a pas de réelle différence - Du moins, il n'y a pas d'impact sur les performances. Je préfère ne pas écrire "this" - L'IDE peut généralement mettre en évidence les appels à this de toute façon, et je pense que c'est moins lisible lorsque chaque accès aux méthodes/champs/... commence par "this.". Mais c'est vraiment une question de préférence personnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X