2011-10-18 2 views
4

Je suis juste curieux au sujet de l'utilisation de this, parce que l'exemple de code et la documentation d'Android ne font pas usage du mot-clé this (J'aime croire que les ingénieurs androïdes sont généralement intelligents, ainsi mon les utilisant comme base). Je suis juste curieux de savoir la raison sous-jacente que les ingénieurs Android ne font pas usage de this beaucoup.Est-ce une mauvaise pratique d'utiliser `this` en Java?

+0

Pourriez-vous donner un exemple où vous ne pouvez pas vivre sans * ceci *? – Gleno

+0

en utilisant 'this' est une bonne pratique pas sûr à propos de Android cependant. Pourrait avoir quelque chose à coder avec la valeur de clé. – Shahzeb

+0

Je suppose que je peux vivre sans, mais personnellement, je trouve que c'est plus facile à utiliser. C'est plus explicite pour moi, ce qui le rend plus clair. – cesar

Répondre

7

C'est principalement une différence stylistique. Je n'ai pas encore vu un argument pour savoir pourquoi c'est bon ou mauvais. Personnellement, j'aime l'utiliser et il y a quelques cas où vous devez l'utiliser. Par exemple si vous avez une classe Anonymous Inner qui veut appeler une méthode de la classe parent, vous avez besoin de this. Exemple:

class MyClass{ 
    protected void doSomething(){ 

    } 

    OnClickListener n = new OnClickListener(){ 
     public void onClick(View v){ 
      MyClass.this.doSomething(); 
     } 
    }; 

} 

Une autre raison d'utiliser this est si un masque d'arguments de méthode d'une variable de membre. Dans ce cas, vous pouvez utiliser this pour faire la distinction entre les deux, bien que je vous recommande de renommer l'argument en quelque chose qui ne masque pas.

class MyClass{ 
    protected int val; 

    public void setVal(int val){ 
     this.val = val; // set the member variable equal to the method argument 
    } 

} 

Une autre raison d'utiliser this est en passant un pointeur vers l'instance de classe actuelle à partir de cette instance. Un exemple de cela est lorsque vous créez un nouveau Intent

Intent i = new Intent(this, NewActivity.class); 

Il y a probablement plus d'endroits où vous aurez besoin d'utiliser this. Ce sont les premiers qui me sont venus à l'esprit.

+0

L'utilisation de ce paramètre n'est nécessaire que si vous souhaitez accéder à une partie de l'instance actuelle masquée par un autre élément dans la portée locale. Ce n'est pas nécessaire dans votre classe interne car OnClickListener n'a pas de doSomething() masquant MyClass # doSomething(). – jackrabbit

1

Peu importe, mais si vous utilisez 'this' dans votre code, assurez-vous de l'utiliser partout. Cela rend votre code clair.

0

C'est un goût plus personnel qu'une mauvaise pratique.

0

Non ce n'est pas, il y a des références à «ceci» dans l'exemple de code pour Android, mais il n'y a aucune raison de penser que c'est une mauvaise pratique. Cependant, la plupart du temps, cela n'est pas nécessaire et cela a peut-être été omis pour des raisons de concision.

Par exemple, un appel à methodA() à partir de la classe définie est appelé this.methodA(). Ce n'est pas nécessaire dans ce cas car cela est implicite lorsque vous faites l'appel. Il est couramment utilisé dans les setters où le nom de l'argument est le même que le nom de la variable que vous définissez.

public void setName(String name) { 
    this.name = name; 
} 
1

Qu'est-ce qui vous fait penser que c'est le cas? Par exemple. SDK coding style guide ne mentionne pas cela et j'ai vu cela étant utilisé dans divers endroits. Cependant, en suivant les directives de nommage pour les variables, cela n'est souvent pas nécessaire et peut être omis, ce qui est souvent le cas. Lorsque vous faites référence à une instance utilisant ce mot-clé, il est bon pour la clarté, mais comme le document mentionne qu'il n'y a pas de style vraiment appliqué et que les règles de nommage ne le rendent pas nécessaire.

par exemple. un setter totalement valable après la nomination avec et sans cela pourrait être

private int mCounter; 
    public void setCounter(int counter) { 
     mCounter = counter 
    } 

private int increment; 
public void setIncrement(int increment) { 
    this.increment = increment 
} 

Notez que dans le premier exemple, vous pouvez, mais ne doivent l'utiliser. Dans la seconde vous devez et le premier il est probablement plus proche du guide de style ..

+0

J'ai juste supposé qu'ils n'aimaient pas ça parce que la plupart des exemples de code et de documentation que j'ai vus ne l'utilisent pas. Cela rendait la documentation un peu plus difficile à lire pour moi, car elle mentionnait une méthode dite 'startService()', et je ne connaissais pas la classe qui contient 'startService()'. – cesar

+0

pour les invocations de méthode, il est différent. S'il n'y a pas de qualificatif en place c'est automatiquement this.quelquechose() et cela est très rarement utilisé dans Java en général. Je ne l'utiliserais pas. –

+0

* "J'ai juste supposé ..." * - le consensus est que vous avez supposé faux. –

0

L'utilisation this est plus d'une mesure de sécurité:

class MyClass{ 
    void doSomething() { 
    } 

    OnClickListener n = new OnClickListener() { 
     void doSomething() { 
     } 

     public void onClick(View v){ 
      MyClass.this.doSomething(); // MyClass#doSomething() 
      this.doSomething(); // OnClickListener#doSomething() 

      doSomething(); // OnClickListener#doSomething() if present, 
          // MyClass#doSomething() otherwise - danger! 
     } 
    }; 
} 

Comme il y a des cas où vous ne pouvez pas contrôler la présence d'un membre ou d'une méthode (par exemple, lorsque le OnClickListener est une classe tiers), à obtenir un comportement prévisible, vous devriez toujours qualifier une telle référence. À moins que le comportement variable soit exactement ce que vous voulez.

Questions connexes