2010-03-11 27 views
60

¿Cuál es la mejor práctica para usar la palabra clave this en Java? Por ejemplo, tengo la clase siguiente:Java: cuándo utilizar la palabra clave 'this'

class Foo { 
    Bar bar; 

    public Foo(Bar bar) { 
     this.bar = bar; 
    } 
} 

eso está bien y todo, pero Java es lo suficientemente inteligente como para saber lo que está sucediendo si cambio de la declaración en el constructor de

bar = bar; 

Entonces, ¿por uso la palabra clave this? (Me doy cuenta de que en algunas situaciones, es totalmente necesario usarlo, solo estoy pidiendo situaciones como esta). En realidad, tiendo a usar la palabra clave solo para leer, pero ¿cuál es la práctica común? Al usarlo por toda la tienda hace que mi código de mirar un poco desordenado, por ejemplo

boolean baz; 
int someIndex = 5; 
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber(); 

Obviamente un poco pobre de código pero ilustra mi ejemplo. ¿Es solo por preferencia personal en estos casos?

+3

La misma pregunta fue publicada hace 2 días: http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class Hay por cierto más incautos: http://www.google.com/search?q=java+when+use+this++wordword+site%3Astackoverflow.com – BalusC

+0

Malo, tuve una búsqueda (claramente muy) rápida utilizando la búsqueda SO pero no lo hice encuentra algo ... – jackbot

+0

Como han señalado otros, estás haciendo una asignación a self (parámetro) más arriba. Pero mi regla de oro es usar 'this' cuando hace que el programa sea más * legible *. Si utiliza algún tipo de convención de nomenclatura para las variables miembro (por ejemplo '_bar' o' mBar'), entonces escribir 'this._bar' es solo un ruido extra, en mi humilde opinión. –

Respuesta

69

pero Java es lo suficientemente inteligente como para saber lo que está sucediendo si cambio de la declaración en el constructor de

bar = bar; 

FALSO! ¡Compila pero no hace lo que crees que hace!

En cuanto a cuándo usarlo, muchas de ellas son preferencias personales. Me gusta usar this en mis métodos públicos, incluso cuando es innecesario, porque ahí es donde ocurre la interacción y es bueno afirmar lo que es mío y lo que no.

Como referencia, se puede comprobar tutoriales de Java del Oracle a cabo sobre this.subject ;-)

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

+11

Es por eso que me gusta marcar todas las variables de parámetros como finales. – crowne

+0

sí, simplemente reasigna la barra variable en el contructor a sí misma. Esto se debe a que la barra ya está definida en el alcance y se superpone a la barra de la barra. –

3

Es una preferencia personal: elija un estilo y cúmplalo. Yo personalmente uso this pero otros piensan que es redundante.

3

Dependiendo de la convención, que se puede utilizar para facilitar la lectura. Hace hincapié en el hecho de que es una variable de objeto.

También me gusta tener argumentos setter con el mismo nombre que la variable (se ve mejor en la firma del método). Necesita this en este caso.

11

En realidad

baz = baz 

elevará esta advertencia

La asignación de Baz variable no tiene efecto

Entonces, ¿qué crees que está mal, el ámbito local prevalece sobre la clase atributo para que DEBE use this keywo rd explícitamente para asignar la variable al atributo de clase.

De lo contrario, la variable contabilizada en la asignación es solo la que se pasa como parámetro y la clase uno se ignora.Es por eso que this es útil, no es un hecho de legibilidad, es un hecho de decidir explícitamente de qué baz estás hablando.

yo diría

uso this donde no usarlo causaría ambigüedades (o advertencia del compilador, que son más importantes), de lo contrario sólo lo dejas. Ya que su propósito es exactamente resolver ambigüedades cuando las suposiciones predeterminadas (primeras verificaciones locales, luego verificar los atributos de clase) no son suficientes.

12

Debe usarlo cuando tenga un parámetro con el mismo nombre que un campo, de lo contrario, se encontrará con problemas. Se compilará, pero no necesariamente hará lo que usted quiere.

Como en cualquier otro lugar, no lo use a menos que sea necesario para su legibilidad. Si lo usa en todas partes, ¡el 20% de su código consistirá en la palabra 'esto'!

+0

Aunque es discutible que la palabra clave 'this' explícita en todas partes puede ser útil. Los lenguajes como Python y Rust lo requieren de hecho ('self'), y nunca he visto esta explicitud como negativa. – phoenix

+0

Respuesta brillante, breve, conciso, hasta el punto –

6
public Foo(Bar bar) { 
    this.bar = bar; 
} 

no es lo mismo que

public Foo(Bar bar) { 
    bar = bar; 
} 

En el segundo caso, la barra de alcance es el parámetro, por lo que se le asigna a sí mismo. this.bar permanece null.

1

Preferencia personal, pero la utilizo para resolver ambigüedades solamente, y supongo que en el muy raro caso es que sea obvio que la variable asignada es un campo. Hay algunos proyectos donde las personas usan "this.field" en cada campo de referencia. Encuentro que esta práctica distrae visualmente hasta el punto de ser desagradable, pero debes estar preparado para ver ese código de vez en cuando.

Creo secretamente que hay un lugar especial en el infierno para las personas que escriben 500 líneas de línea que tienen 275 'estas' palabras clave en ellas, pero este estilo se encuentra en algunos proyectos de código abierto, así que para cada uno creo.

+0

+1 Si encuentra que usa esto. * En todas partes es muy molesto. Si está utilizando un IDE moderno y diseña clases adecuadamente, nunca se encontrará con una situación en la que tenga que averiguar cuál es la referencia a la variable (atributo, variable local, etc.) – helpermethod

2

Siempre trato de usar la palabra clave this en los objetos de la clase local.

Lo uso para recordar visualmente si un objeto es un objeto estático o un objeto de clase.

Nos ayuda a mí y al compilador a diferenciar entre args de método y objeto de clase local.

public void setValue(int value){ 
    this.value = value; 
} 

Me ayuda a me recuerdan visualmente si hay un objeto tan local en una clase interna/anidada/anónimo para diferenciarla de la encapsulación de objetos de clase. Debido a que no this si hay prefijado, mi convención me recuerdan que es un objeto de la clase de encapsulación

public class Hello{ 
    public int value = 0; 
    public boolean modal = false; 

    public class Hellee{ 
    public int value = 1; 
    public getValue(){ 
     if (modal) 
     return 0; 
     return this.value; 
    } 
    } 
} 
10

this palabra clave se refiere al objeto de la clase en la que se invoca algún método.
Por ejemplo:

public class Xyz { 
    public Xyz(Abc ob) 
    { 
     ob.show(); 
    } 
} 

public class Abc { 
    int a = 10; 

    public Abc() 
    { 
     new Xyz(this); 
    } 

    public void show() 
    { 
     System.out.println("Value of a " + a); 
    } 

    public static void main(String s[]) 
    { 
     new Abc(); 
    } 
} 

Aquí en Abc() estamos llamando Xyz() que necesita de objetos de clase ABC .. Así podemos pasar this vez de nuevo Abc(), porque si pasamos nueva Abc() aquí se llamará a sí mismo una y otra de nuevo.

También usamos esto para diferenciar variables de clase y variables de método locales. por ejemplo

class Abc { 
    int a; 

    void setValue(int a) 
    { 
     this.a = a; 
    } 
} 

Aquí this.a es refiere a la variable A de clase Abc. Por lo tanto, tiene el mismo efecto que usa el nuevo Abc().a;.

Entonces usted puede decir que this se refiere al objeto de la clase actual.

0

Úselo para clonar objetos (pasando la referencia de sí mismo a través de un constructor de copia).

Útil para el objeto que hereda Cloneable.

public Foo implements Cloneable { 
    private String bar; 

    public Foo(Foo who) { 
    bar = who.bar; 
    } 

    public Object getClone() { 
    return new Foo(this); //Return new copy of self. 
    } 
} 
2
void set(int real) 
{ 
    this.real = real; 
} 

aquí this es una palabra clave utilizada cuando hay variable de instancia es la misma que la variable local.
otro uso de this es sobrecarga de constructor. puede llamar al constructor en un constructor sobrecargado.

7

Es común el uso de este palabra clave en explícita la invocación del constructor. Puede ver un ejemplo del documentation.

public class Rectangle { 
    private int x, y; 
    private int width, height; 

    public Rectangle() { 
     this(0, 0, 1, 1); 
    } 
    public Rectangle(int width, int height) { 
     this(0, 0, width, height); 
    } 
    public Rectangle(int x, int y, int width, int height) { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 
    ... 
} 
Cuestiones relacionadas