2010-03-22 18 views
7

Estoy leyendo un libro sobre Java. Acaba de explicar cómo se crea una clase llamada "deck" que contiene una matriz de tarjetas como su variable (s) de instancia. Aquí está el código de snippit:¿Por qué no es el "esto"? comando necesario en este constructor? (java)

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

por qué no se utiliza el comando this.?

por ejemplo, por qué no es el código siguiente:

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

Tiene un error en el segundo ejemplo. Hay 2 '['. –

+0

Nota: Si desea analizar si es una * buena idea * usar u omitir el 'this', entonces hay muchos otros lugares para debatir eso. Por ejemplo, vea esta pregunta: http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java –

Respuesta

12

this. es implícita.

En general, es una buena práctica (al menos I considerarlo uno) usar solo this cuando sea absolutamente necesario. Cuando tiene una variable local llamada cards y una variable miembro llamada cards, por ejemplo, necesitará this.cards para referirse a la variable miembro, ya que cards se refiere a la variable local.

En tal caso, this es una buena idea (aunque podría ser una mejor idea cambiar el nombre de la variable miembro).

En cualquier otro caso, donde un implícito this puede funcionar, úselo.

+0

puede esto. siempre se omite, entonces? o quiere decir que el autor tiene la intención de estar allí pero no lo está escribiendo porque es implícito en relación con el lector? – David

+0

@David: siempre se puede omitir a menos que también tenga una variable local con el mismo nombre (ya que entonces 'cards' en sí misma sería la variable local, no la variable de instancia, y usted necesitaría' this.cards' para referencia explícita de la instancia). – Chris

+0

@David, @Chris Smith: Heh ... Estaba editando como me comentó. – Randolpho

1

La palabra clave "this" es redundante en ese caso. las cartas ya están definidas en el alcance de la clase y el compilador sabe que el miembro es parte de "esta" clase.

2

This es implícito.

Vamos Elaborar:

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

En este caso se pasa en una serie de cartas que comparte el mismo nombre que el objeto de matriz de tarjetas. This se refiere al miembro de datos de su objeto, no al parámetro del constructor.

0

"esto" está implícito. No es necesario usar "esto". Normalmente lo pongo allí solo para hacer que el código sea legible, pero de nuevo no es necesario.

20

Porque no hay ambigüedad. Solo hay una variable cards. this sería necesario si hubiera dos, uno de los cuales es una variable de instancia (parte de la clase, como lo es actualmente) y el otro, un argumento del constructor.

Y por cierto, this no es un "comando". Es una "palabra clave".

3

Cuando utiliza el identificador cards en el constructor, el compilador nota que el campo (una variable de miembro a.k.a) cards está dentro del alcance y lo usa. this.cards solo sería necesario para resolver ambigüedades, por ejemplo, si también tenía una variable local o parámetro llamado cards.

3

Tendría sentido si también tiene un parámetro llamado cards. Entonces, this.cards especificaría que quiere decir exactamente el campo cards de la clase, no el parámetro.

Pero, de todos modos, se considera una buena práctica usar this. en los casos que se describen en el ejemplo.

+3

No, no es una buena práctica agregar ruido visual a su código fuente. – Bombe

+2

@Bombe: Eso depende de a quién le preguntes. * Algunas * personas consideran que usar 'esto' es una buena práctica, mientras que otras no. –

+0

De hecho. Por lo tanto, no es una buena práctica porque no hay buenas prácticas, de todos modos. :) – Bombe

4

La referencia del objeto this está implícito, pero puede ser útil para la claridad (y es necesario para la desambiguación entre el miembro de un objeto y una variable local del mismo nombre, como en el constructor a continuación):

public class Foo { 
     final private int x; 

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

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

No necesita calificar todo el acceso a los miembros con la palabra clave this. Solo necesita usarlo cada vez que otra variable oculte el método de miembro.

Y eso no es una característica limitada al constructor, pero está disponible en todos los métodos:

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

trato de seleccionar los nombres de variables de una manera que no requiere la palabra "this". Es decir, si tengo una propiedad llamada "valor", pasaré a un parámetro llamado val.

Un buen uso de la palabra clave "this" es para la sobrecarga del constructor. Considere lo siguiente (voy a usar esto para demostrar la diferencia.):

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

Cuando es posible, voy a tratar de evitar que la propiedad y el parámetro de nombre de la misma para evitar lo que se ve en la línea 6. Sin embargo , el uso de la palabra clave this para llamar a otro constructor es una buena forma de evitar la duplicación de código. Este es un ejemplo trivial, pero cuando comienzas a encontrarte con constructores que hacen mucho del mismo trabajo con pequeñas diferencias entre ellos, resulta bastante útil.

Cuestiones relacionadas