2009-07-07 16 views
19

Ich lese meine Deitel, Java Wie Programm Buch und stieß auf den Begriff shadowing. Wenn Shadowing erlaubt ist, welche Situation oder welchen Zweck gibt es dafür in einer Java-Klasse?Wofür wird in einer Java-Klasse das variable Shadowing verwendet?

Beispiel:

public class Foo { 

    int x = 5; 

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

Antwort

32

Der grundlegende Zweck des Shadowings ist die Entkopplung des lokalen Codes von der umgebenden Klasse. Wenn es nicht verfügbar war, dann bedenken Sie den folgenden Fall.

Eine Klasse Foo in einer API ist freigegeben. In Ihrem Code bilden Sie eine Unterklasse und verwenden in Ihrer Unterklasse eine Variable namens bar. Dann veröffentlicht Foo ein Update und fügt seiner Klasse eine geschützte Variable namens Bar hinzu.

Jetzt wird Ihre Klasse wegen eines Konflikts, den Sie nicht vorhersehen konnten, nicht ausgeführt.

Tun Sie dies jedoch nicht absichtlich. Lass das nur geschehen, wenn es dir wirklich egal ist, was außerhalb des Bereichs passiert.

+7

Ich mag deinen letzten Punkt "Lass das nur passieren, wenn es dir wirklich egal ist, was außerhalb des Bereichs passiert." ... Sie werden wissen, wann Sie anfangen müssen, sich zu kümmern, wenn etwas Seltsames mit dem Variablenwert Ihrer Instanz losgeht :))) Wie auch immer, es ist eine gute Praxis, immer den Namen this.variable innerhalb Ihrer Methoden zu verwenden, die den Wert einer Instanz setzen Variable... – luigi7up

8

Ein Hauptzweck ist es, Menschen zu verwirren. Es ist eine schlechte Übung und sollte vermieden werden.

+0

Umstrittene gehe ich davon aus ;-) –

+6

Können Sie erklären, wie weiter this.x = x gar verwirrend? – RichieHH

13

Es kann für Setter nützlich sein, wenn Sie nicht wollen, eine separate Variablennamen nur für die Methodenparameter zB zum Erstellen:

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

Abgesehen davon, dass ich sie vermeiden würde.

+1

Das ist ein schrecklicher Grund, Variablen zu überschatten. Durch das Shadowing werden Sie immer auf mögliche Fehler aufmerksam, und es ist einfacher, Variablen mit Bereichsinformationen zu benennen und den Namen des Parameters zu ändern, als "dieses" einzuschließen. jedes Mal. – Rick

+3

Für einen einfachen Setter, wie im obigen Beispiel, ich denke, es ist in Ordnung, eine Umbenennung des Parameters würde Dinge hässlich machen. Etwas Komplizierteres als das, stimme ich zu, vermeide es vollständig. –

4

Shadowing ist nicht wirklich ein Java-Begriff. In allen Fällen, in denen eine in einem Bereich deklarierte Variable den gleichen Namen wie eine Variable in einem größeren Bereich hat, wird diese Variable schattiert.

Einige häufige Anwendungen für Shadowing ist, wenn Sie innere und äußere Klassen haben und eine Variable mit dem gleichen Namen beibehalten möchten.

Wenn Sie es jedoch vermeiden können, sollten Sie, da es zu Verwirrung führen kann.

1

Die beiden häufigsten Anwendungen sind Konstrukteure und Set-Methoden:

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

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

Sehr occassionally es ist nützlich, wenn Sie eine Kopie der Variablen in einem einzigen Augenblick wollen, aber die Variable innerhalb des Methodenaufruf ändern.

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

(Natürlich ist ein konstruiertes Beispiel mit dem noblen for-Schleife überflüssig.)

+0

Es ist nicht notwendig, für jeden dieser Fälle Schatten zu werfen. – Rick

+1

@Rick Niemand sprach davon, dass es notwendig sei. Shadowing ist nicht notwendig. –

+0

Ich sage, man sollte niemals Schatten. Benennen Sie die Variablen einfach anders. – Rick