2010-03-22 10 views
7

Sto leggendo un libro su java. È solo per spiegare come si crea una classe chiamata "mazzo" che contiene una serie di carte come sue variabili di istanza. Ecco il codice snippit:Perché non è il "questo". comando necessario in questo costruttore? (java)

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

perché non è il comando this. utilizzato?

ad esempio perché non è questo il codice:

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

Si ha un errore nel secondo esempio. Ci sono 2 '['. –

+0

Nota: se vuoi discutere se è * una buona idea * usare o omettere "questo", allora ci sono molti altri posti in cui discutere. Ad esempio, vedi questa domanda: http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java –

risposta

12

this. è implicita.

In generale, è una buona pratica (almeno I considerarla una sola) utilizzare solo this quando assolutamente necessario. Quando si ha una variabile locale denominata cards e una variabile membro denominata cards, ad esempio, è necessario il numero this.cards per fare riferimento alla variabile membro, poiché cards si riferisce alla variabile locale.

In tal caso, this è una buona idea (anche se potrebbe essere una buona idea rinominare la variabile membro).

In ogni altro caso, in cui un implicito this può funzionare, utilizzarlo.

+0

può questo. essere omesso sempre allora? o intendi che l'autore intende esserci ma non lo scrive perché è implicito rispetto al lettore? – David

+0

@David: può sempre essere omesso a meno che non si abbia anche una variabile locale con lo stesso nome (dato che 'cards' da sola sarebbe la variabile locale non la variabile di istanza, e avresti bisogno di' this.cards' per fare riferimento esplicitamente all'istanza). – Chris

+0

@David, @ Chris Smith: Heh ... Stavo modificando come hai commentato. – Randolpho

1

In questo caso, la parola chiave "this" è ridondante. le carte sono già definite nell'ambito della classe e il compilatore sa che il membro fa parte di questa "classe".

2

This è implicito.

Diamo elaborata:

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

In questo caso si passa in una serie di schede che condivide lo stesso nome di matrice dell'oggetto di carte. This fa riferimento al datamember dell'oggetto, non al parametro del costruttore.

0

"questo" è implicito. Non è necessario usare "questo". Di solito lo metto lì solo per rendere leggibile il codice, ma di nuovo non è richiesto.

20

Perché non c'è ambiguità. C'è solo una variabile cards. this sarebbe necessario se ce ne fossero due, uno dei quali è una variabile di istanza (parte della classe, come è attualmente), e l'altro - un argomento del costruttore.

E btw, this non è un "comando". È una "parola chiave".

3

Quando si utilizza l'identificatore cards nel costruttore, il compilatore rileva che il campo (a.k.a. membro variabile) cards è nell'ambito e lo utilizza. this.cards sarebbe necessario solo per risolvere ambiguità, ad esempio se si dispone anche di una variabile locale o di un parametro denominato cards.

3

Avrebbe senso se si dispone anche di un parametro denominato cards. Quindi this.cards specificare che si intende esattamente il campo cards della classe, non il parametro.

Ma in ogni caso è consigliabile utilizzare this. in casi come descritto nell'esempio.

+3

No, non è consigliabile aggiungere rumore visivo al codice sorgente. – Bombe

+2

@Bombe: Dipende da chi chiedi. * Alcune * persone considerano l'uso di "questo" come buona pratica, mentre altri no. –

+0

Infatti. Quindi, non è una buona pratica perché non ci sono buone pratiche, comunque. :) – Bombe

4

è implicito riferimento dell'oggetto this, ma può essere utile per chiarezza (ed è necessario per disambiguation tra il membro di un oggetto e una variabile locale con lo stesso nome, come nel costruttore sottostante):

public class Foo { 
     final private int x; 

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

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

Non è necessario qualificare tutti gli accessi ai membri con la parola chiave this. Devi solo usarlo ogni volta che un'altra variabile nasconde il metodo membro.

E che non è una caratteristica limitata al costruttore, ma disponibile in tutti i metodi:

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

cerco di selezionare i nomi delle variabili in un modo che non richiede il "questo" parola chiave. Cioè, se ho una proprietà denominata "valore", passerò a un parametro chiamato val.

Un buon utilizzo della parola chiave "this" è per il sovraccarico del costruttore. Si consideri il seguente (Userò questo per dimostrare la differenza.):

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

Quando possibile, cercherò di evitare di avere la proprietà e parametro name la stessa per evitare quello che si vede sulla linea 6. Tuttavia , l'uso di questa parola chiave per chiamare un altro costruttore è un buon modo per prevenire la duplicazione del codice. Questo è un esempio banale, ma quando inizi a trovarti con costruttori che fanno molto dello stesso lavoro con piccole differenze tra di loro, è abbastanza utile.

Problemi correlati