2010-03-22 5 views
7

Je lis un livre sur java. Il s'agit juste d'expliquer comment vous créez une classe appelée "deck" qui contient un tableau de cartes en tant que variable (s) d'instance. Voici le code snippit:Pourquoi ce n'est pas "ceci"? commande nécessaire dans ce constructeur? (java)

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     cards = new Card[n]; 
    } 
} 

pourquoi pas la commande this. utilisé?

par exemple pourquoi n'est pas le code ceci:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     this.cards = new Card[n]; 
    } 
} 
+0

Vous avez une erreur dans le deuxième exemple. Il y a 2 '['. –

+0

Note: Si vous voulez discuter si c'est une * bonne idée * d'utiliser ou d'omettre le 'this.', alors il y a beaucoup d'autres endroits pour en débattre. Par exemple, voir cette question: http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java –

Répondre

12

this. est implicite.

En général, c'est une bonne pratique (au moins I en tenir compte) pour utiliser seulement this lorsque cela est absolument nécessaire. Lorsque vous avez une variable locale nommée cards et une variable membre nommée cards, par exemple, vous aurez besoin de this.cards pour faire référence à la variable membre, car cards fait référence à la variable locale.

Dans ce cas, this est une bonne idée (bien qu'il puisse être préférable de renommer la variable membre).

Dans tous les autres cas, où un this implicite peut fonctionner, utilisez-le.

+0

peut cela. toujours être omis alors? ou voulez-vous dire que l'auteur l'intention d'être là mais ne l'écrit pas parce que son implicite par rapport au lecteur? – David

+0

@David: Il peut toujours être omis sauf si vous avez aussi une variable locale avec le même nom (comme alors 'cards' seul serait la variable locale pas la variable d'instance, et vous auriez besoin de' this.cards' pour référencer explicitement l'instance). – Chris

+0

@David, @Chris Smith: Heh ... Je travaillais comme vous l'avez commenté. – Randolpho

1

Le mot clé "this" est redondant dans ce cas. Les cartes sont déjà définies à la portée de la classe et le responsable sait que le membre fait partie de cette classe.

2

This est implicite.

Faisons élaboré:

class Deck { 
    Card[] cards; 
    public Deck (Card[] cards) { 
      this.cards = cards; 
    } 
} 

Dans ce cas, vous passez dans un tableau de cartes qui partage le même nom que le tableau de cartes de l'objet. This fait référence au datamember de votre objet, pas au paramètre du constructeur.

0

"Ceci" est implicite. Il n'y a pas besoin d'utiliser "ceci". Je le mets habituellement là juste pour rendre le code lisible, mais encore une fois ce n'est pas nécessaire.

20

Parce qu'il n'y a pas d'ambiguïté. Il n'y a qu'une seule variable cards. this serait nécessaire s'il y en avait deux - l'une étant une variable d'instance (partie de la classe, telle qu'elle est actuellement), et l'autre - un argument du constructeur.

Et btw, this n'est pas une "commande". C'est un "mot clé".

3

Lorsque vous utilisez l'identificateur cards dans le constructeur, le compilateur remarque que le champ (variable membre a.k.a.) cards est dans la portée et l'utilise. this.cards serait seulement nécessaire pour résoudre les ambiguïtés, par exemple si vous aviez aussi une variable locale ou un paramètre nommé cards.

3

Il serait logique si vous avez également un paramètre nommé cards. Alors this.cards spécifierait que vous voulez dire exactement le champ cards de la classe, pas le paramètre.

Mais de toute façon c'est une bonne pratique d'utiliser this. dans les cas comme décrit dans votre exemple.

+3

Non, il n'est pas recommandé d'ajouter du bruit visuel à votre code source. – Bombe

+2

@Bombe: Cela dépend de qui vous demandez. * Certaines * personnes considèrent l'utilisation de ceci comme une bonne pratique, alors que d'autres ne le font pas. –

+0

En effet. Donc, ce n'est pas une bonne pratique parce qu'il n'y a pas de bonnes pratiques, de toute façon. :) – Bombe

4

référence this de l'objet est implicite, mais il peut être utile pour la clarté (et il est nécessaire homonymie entre le membre d'un objet et une variable locale du même nom, comme dans le constructeur ci-dessous):

public class Foo { 
     final private int x; 

     public Foo(int x) { this.x = x; } 

     public int getX() { return this.x; } 
    } 
8

Vous n'avez pas besoin de qualifier tous les accès aux membres avec le mot clé this. Vous n'avez besoin de l'utiliser que lorsqu'une autre variable masque la méthode membre.

Et ce n'est pas une caractéristique limitée au constructeur, mais disponible dans toutes les méthodes:

public class Test 
{ 
    private int member; 
    private int value; 
    public Test(int value) { 
     member = 5; 
     this.value = value; // required to differentiate from the parameter 
    } 
    public void f(int member) { 
     int value = 5 
     this.member = value; // assign local 'value' (5) to member 'member' 
     this.value = member; // assign parameter 'member' to member 'value' 
    } 
} 
0

J'essaie de sélectionner des noms variables d'une manière qui ne nécessite pas le mot-clé « this ». C'est-à-dire, si j'ai une propriété nommée "value", je passerai à un paramètre appelé val.

Une bonne utilisation du mot-clé "this" est pour la surcharge du constructeur. Considérez ce qui suit (je l'utiliser pour démontrer la différence.):

public class Person 
{ 
    int age; 
    public Person(int age) 
    { 
     this.age=age; 
    } 
    public Person() 
    { 
     this(25); //default age 
    } 
} 

Lorsque possible, je vais essayer d'éviter d'avoir le nom propriété et paramètre la même chose pour éviter ce que vous voyez sur la ligne 6. Cependant , l'utilisation de ce mot-clé pour appeler un autre constructeur est un bon moyen d'empêcher la duplication de code. C'est un exemple trivial, mais quand vous commencez à vous retrouver avec des constructeurs qui font beaucoup du même travail avec de petites différences entre eux, cela devient très pratique.

Questions connexes