2009-07-07 12 views
19

Estoy leyendo mi libro Deitel, Java How to Programme y me encontré con el término sombreado. Si se permite el sombreado, ¿qué situación o qué propósito hay en una clase de Java?¿Para qué sirve el sombreado variable en una clase de Java?

Ejemplo:

public class Foo { 

    int x = 5; 

    public void useField() { 
     System.out.println(this.x); 
    } 
    public void useLocal() { 
     int x = 10; 
     System.out.println(x); 
    } 
} 

Respuesta

32

El objetivo básico del sombreado es desacoplar el código local de la clase circundante. Si no estaba disponible, considere el siguiente caso.

Aparece una clase Foo en una API. En tu código, lo subclases, y en tu subclase utilizas una variable llamada barra. Luego Foo lanza una actualización y agrega una variable protegida llamada Bar a su clase.

Ahora su clase no se ejecutará debido a un conflicto que no pudo anticipar.

Sin embargo, no lo haga a propósito. Solo permita que esto suceda cuando realmente no le importe lo que sucede fuera del alcance.

+7

Me gusta su punto final "Solo deje que esto suceda cuando realmente no le importe lo que sucede fuera del alcance". ... sabrá cuándo comenzar a preocuparse cuando algo raro empiece a suceder con el valor de la variable de instancia :))) De todos modos, es una buena práctica usar siempre el this.variable_name dentro de sus métodos que están configurando el valor de una instancia variable... – luigi7up

8

Uno de los propósitos principales es confundir a la gente. Es una mala práctica y debe evitarse.

+0

polémico que asumen ;-) –

+6

Puede explicar con más detalle cómo this.x = x es del todo confuso? – RichieHH

13

Puede ser útil para los emisores en los que no quieren tener que crear un nombre de variable separada sólo para el parámetro del método, por ejemplo:

public void setX(int x) { 
    this.x = x; 
} 

Aparte de eso yo evitaría ellos.

+1

Esa es una razón terrible para las variables de sombra. El sombreado siempre lo abre a posibles errores, y es más fácil nombrar variables con información de alcance, así como cambiar el nombre del parámetro, que incluir "esto". cada vez. – Rick

+3

Para un setter simple, como en el ejemplo anterior, creo que está bien, renombrar el parámetro haría las cosas feas. Algo más complicado que esto, estoy de acuerdo, evitar por completo. –

4

Sombreado no es realmente un término solo de Java. En cualquier instancia donde una variable declarada en un ámbito tiene el mismo nombre que una en un ámbito mayor, esa variable se sombrea.

Algunos usos comunes para el sombreado es cuando tiene clases internas y externas y desea mantener una variable con el mismo nombre.

Si puede evitarlo, debe hacerlo ya que puede causar confusión.

1

Los dos usos más comunes son los constructores y los métodos establecidos:

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

public void setX(int x) { 
    this.x = x; 
} 

muy de vez en cuando es útil si desea una copia de la variable en un solo instante, pero la variable pueden cambiar dentro de la llamada al método.

private void fire() { 
    Listener[] listeners = this.listeners; 
    int num = listeners.length; 
    for (int ct=0; ct<num; ++ct) { 
     listeners[ct].stateChanged(); 
    } 
} 

(Por supuesto, un ejemplo contribuido hizo innecesario con el elegante para el lazo.)

+0

No es necesario sombrear ninguno de estos casos. – Rick

+1

@Rick Nadie hablaba de que fuera necesario. Sombreado no es necesario. –

+0

Digo, nunca se debe sombrear. Solo nombra las variables de manera diferente. – Rick