2009-01-02 13 views
24

Al hacer referencia a las variables de clase, ¿por qué la gente lo antepone con this? No estoy hablando del caso cuando this se usa para eliminar la ambigüedad de los parámetros del método, sino cuando parece innecesario.En Java, ¿por qué la gente antepone campos con `this`?

Ejemplo:

public class Person {   
    private String name; 

    public String toString() { 
     return this.name; 
    } 
} 

En toString, ¿por qué no hacer referencia a name como name?

return name; 

¿Qué this.name comprar?

Here's pregunta de stackoverflow cuyo código tiene this en trámite.

Respuesta

6

la misma razón por qué algunas personas, como para anteponer los miembros de datos privados con "m_" o interfaces de nombre "IFoo". Creen que aumenta la legibilidad y la claridad. Si usted está de acuerdo o no con convenciones como estas es una cuestión de gusto.

2

Aparte de la desambiguación con los parámetros del método, no le compra nada. Tal vez claridad/legibilidad, pero eso realmente depende de tu estilo.

11

No hace nada en el nivel del idioma. Pero da una indicación inmediata a alguien que lee el código sobre el alcance de la variable, lo que mejora la comprensión del código.

+0

yo hubiera dicho lo mismo. Aumenta la comprensibilidad, pone las cosas en su contexto correcto, lo que detiene la ambigüedad. El bytecode eventual sería el mismo de todos modos, creo. – Kezzer

+0

No creo que mejore la comprensión. IMO, por supuesto. Ese podría ser el caso con pocos, no sé. –

+0

Creo que eso es subjetivo entonces, y relativo al individuo. – Kezzer

56
  1. La programación defensiva (en caso de que alguien de editar el código más tarde añade un parámetro o local con un nombre conflictivo
  2. Haga que el código "documentar auto," más evidente
37

A veces es necesario para eliminar la ambigüedad :

public void setFoo(Bar foo) { 
    this.foo = foo; 
} 

en otras ocasiones, es sólo una cosa estilística en general, trato de evitar this.blah siempre que sea posible, ya que es más v. erbose. En caso de que se lo pregunte, el bytecode resultante es exactamente el mismo.

3

Le ayuda a identificar las variables de miembros de un vistazo ..
el ToString() anterior es demasiado pequeño para ilustrar esto.
Supongamos que tiene un método de tamaño de pantalla. Calcula, asigna, intercambia una combinación de variables locales y de instancia. this.memberVar o this.PropertyName lo ayuda a realizar un seguimiento de dónde está modificando el estado de la instancia a través de asignaciones de campos o definidores de propiedades.

1

Son quizás un programador de Python y se torturan/perdieron/confundieron sin un esto explícito.

0

Otra cosa a tener en cuenta es el idioma en sí. No mencionaste específicamente Java (aunque supongo que realmente no tenías nada más en mente, por lo que este comentario es más para tu información), pero como los anteriores han mencionado, es una forma excelente de hacer código propio. documentando para evitar confusiones en el futuro cuando alguien más comienza a modificar tu código base.

Si toma PHP, sin embargo, el uso de $this es típicamente requerido al hacer referencia a variables de clase. Con diferentes reglas entre idiomas, a menudo es más fácil seguir con el patrón que es común entre ellos, un patrón que resulta ser un estilo de codificación muy sólido. Es más fácil para mí simplemente anteponer this a todo lo que trate de recordar qué idioma lo requiere y qué lenguaje simplemente "lo prefiere".

10

La mayoría de las veces veo que la gente hace esto porque desencadena el intellisense. Yo personalmente prefiero dejar el "esto". porque crea más código sin ningún valor.

+3

Pero aún puedes activar Intellisense sin él. Control-Space en un enlace en blanco en Eclipse e IntelliJ desencadena intellisense. Es idéntico a Control-Space de 'esto'. –

0

"this" evita la confusión con las variables de instancia con el mismo nombre en la clase principal/es.

Es casi el complemento a anteponer "super".

0

Intento usar 'this.whatever' al escribir grandes fragmentos de código, porque era más fácil averiguar a qué se refería. Al leer grandes porciones de código escrito por otras personas, en ciertos puntos a menudo me confundía si estaban haciendo referencia a variables de instancia o variables locales.

2

Creo que no hay nada de malo si pones esto antes del nombre de la propiedad. Esto ayuda a eliminar la ambigüedad de la propiedad de las variables locales si tiene alguna declarada con el mismo nombre (lo que puede suceder en un constructor cuando inicializa las propiedades).

No afecta el rendimiento, no crea ningún problema para la legibilidad (si es que facilita la lectura).

Así que no creo que tengamos que preocuparnos por esto. Permita que los programadores tomen su propia decisión.

6

En el mundo .NET la herramienta Microsoft StyleCop también tiene una regla llamada "llamadas de prefijo local con este":

Una violación de esta regla se produce cada vez que el código contiene una llamada a un miembro de instancia de lo local clase o una clase base que no está prefijada con 'this.'. Se produce una excepción a esta regla cuando hay una anulación local de un miembro de la clase base, y el código intenta llamar al miembro de la clase base directamente, evitando la anulación local. En este caso, la llamada puede tener el prefijo 'base' en lugar de 'esto'.

De forma predeterminada, StyleCop no permite el uso de guiones bajos o m_ para marcar los campos de clases locales, a favor del prefijo 'this.'. La ventaja de usar 'esto' es que se aplica por igual a todos los tipos de elementos, incluidos métodos, propiedades, etc., y no solo a los campos, haciendo que todas las llamadas a los miembros de la clase sean reconocibles al instante, independientemente del editor que se use para ver el código . Otra ventaja es que crea una diferenciación rápida y reconocible entre los miembros de la instancia y los miembros estáticos, que no tienen prefijo.

Una ventaja final del uso del prefijo 'this.' Es que al escribir esto. hará que Visual Studio muestre la ventana emergente de IntelliSense, haciendo que el desarrollador pueda elegir de forma rápida y sencilla al miembro de la clase a quien llamar.

Mi sugerencia es elegir una convención (use esto o no) y quédese con eso.

0

El código es más simple de leer. Otra buena práctica, en mi opinión, es llamar al getXXX() en toString() (en lugar de this.XXX), porque el getXXX() puede tener una lógica importante.

Creo que usar el nombre de atributo sin esto no es una buena idea para el mantenimiento de la aplicación.

3

Un pequeño aparte, pero puede valer la pena señalar que la herramienta "Limpiar" en Eclipse se puede configurar para agregar/eliminar esto automáticamente. a los accesos de los miembros según la preferencia.

"Java/Código del estilo/Limpieza" en el diálogo de preferencias.

2

El único lugar que utilizo esto es en los constructores de las clases donde algunos/la mayor parte de los campos de la clase pueden ser suministrados por el constructor. Utilizo esto en lugar de usar nombres cortos para la firma del método, simplemente parece más consistente que abreviar.

Por ejemplo, en una clase de "racional"

En lugar de hacer

class Rational 
{ 
    int denominator; 
    int numerator; 

    public Rational(int d, int n) 
    { 
     denominator = d; 
     numerator = n; 
    } 
} 

hago esto.

class Rational 
{ 
    int denominator; 
    int numerator; 

    public Rational(int denominator, int numerator) 
    { 
     this.denominator = denominator; 
     this.numerator = numerator; 
    } 
} 

De esta forma, las personas que llaman saben más sobre para qué son los parámetros de los constructores.

Cuestiones relacionadas