2010-03-11 14 views
60

Was ist die beste Vorgehensweise für die Verwendung des Schlüsselwortes this in Java? Zum Beispiel habe ich die folgende Klasse:Java - Wann dieses '' 'Schlüsselwort verwendet werden soll

class Foo { 
    Bar bar; 

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

Das ist in Ordnung und alles, aber Java ist klug genug, um zu wissen, was passiert, wenn ich die Anweisung im Konstruktor

bar = bar; 

Warum Verwendung ändern das Schlüsselwort this? (Ich weiß, dass es in manchen Situationen absolut notwendig ist, es zu benutzen, ich frage nur nach solchen Situationen). Tatsächlich neige ich dazu, das Keyword nur aus Gründen der Lesbarkeit zu verwenden, aber was ist die übliche Praxis? Mit ihm über den ganzen Laden macht meinen Code ein bisschen chaotisch aussehen, zum Beispiel

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

Offensichtlich ein armes Stück Code, aber es zeigt mein Beispiel. Ist es in diesen Fällen nur auf persönliche Vorlieben zurückzuführen?

+3

Die gleiche Frage wurde vor 2 Tagen geschrieben: http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class Es durch die Art und Weise mehr Betrogenen ist: http://www.google.com/search?q=java+with+use+this+keyword+site%3Astackoverflow.com – BalusC

+0

Mein Problem, ich hatte eine (sehr, sehr) schnelle Suche mit der SO-Suche, aber nicht find anything ... – jackbot

+0

Wie andere bereits erwähnt haben, machst du oben eine Zuweisung zu self (Parameter). Aber meine Faustregel ist, 'this' zu verwenden, wenn es das Programm * lesbarer * macht. Wenn Sie eine Art von Benennungskonvention für Elementvariablen verwenden (z. B. '_bar' oder' mBar'), dann ist das Schreiben von 'this._bar' nur zusätzliches Rauschen, IMHO. –

Antwort

69

aber Java ist klug genug, um zu wissen, was passiert, wenn ich die Anweisung im Konstruktor

bar = bar; 

FALSCH ändern! Es kompiliert, aber es tut nicht, was Sie denken, dass es tut!

Wann es zu verwenden ist, ist viel davon persönliche Vorliebe. Ich benutze gerne this in meinen öffentlichen Methoden, auch wenn es unnötig ist, denn hier findet die Schnittstelle statt und es ist schön zu behaupten, was meins ist und was nicht.

Als Referenz können Sie die Java-Tutorials Oracle Besuche über this.subject ;-)

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

+11

Deshalb möchte ich alle Parametervariablen als final markieren. – crowne

+0

Ja, es weist den Variablenbalken im Konstruktor nur sich selbst zu. Dies liegt daran, dass der Balken bereits im Bereich definiert ist und über den Balken in der Leiste hinausgeht. –

3

Es ist eine persönliche Vorliebe - wählen Sie einen Stil und bleiben Sie dabei. Ich persönlich benutze this, aber andere denken, dass es überflüssig ist.

3

Je nach Konvention, können Sie es aus Gründen der Lesbarkeit verwenden können. Es betont die Tatsache, dass es eine Objektvariable ist.

Ich habe auch gerne Setter Argumente mit dem gleichen Namen wie die Variable (sieht besser in Methodensignatur). Sie benötigen in diesem Fall this.

11

Eigentlich

baz = baz 

diese Warnung erhöhen wird

Die Zuordnung zu Variable baz hat keine Wirkung

Also, was Sie denken, falsch ist, überschreibt der lokale Geltungsbereich der Klasse Attribut so Sie MUSS verwenden this keywo um die Variable explizit dem Klassenattribut zuzuordnen.

Andernfalls ist die Variable, die in die Zuweisung einbezogen wird, nur die als Parameter übergebene Variable und die Klasse eins wird ignoriert.Das ist, warum this ist nützlich, es ist keine Tatsache der Lesbarkeit, es ist eine Tatsache, explizit zu entscheiden, welche baz Sie sprechen.

würde ich sagen,

Verwendung this wo immer es nicht verwenden würde Unklarheiten verursachen (oder Compiler-Warnung, die wichtiger sind), sonst ist es einfach zu gehen. Da sein Zweck genau darin besteht, Mehrdeutigkeiten zu lösen, wenn Standardannahmen (zuerst Locals überprüfen, dann Klassenattribute überprüfen) nicht ausreichen.

12

Sie sollten es verwenden, wenn Sie einen Parameter mit dem gleichen Namen wie ein Feld haben, sonst treten Probleme auf. Es wird kompiliert, tut aber nicht unbedingt, was Sie wollen.

Wie überall sonst, verwenden Sie es nicht, es sei denn, es ist aus Gründen der Lesbarkeit erforderlich. Wenn Sie es überall verwenden, bestehen 20% Ihres Codes aus dem Wort "this"!

+0

Es ist zwar fraglich, dass das explizite 'this'-Schlüsselwort überall hilfreich sein kann. Sprachen wie Python und Rust erfordern es in der Tat ("Selbst"), und ich habe diese Exklusivität nie als ein Negativ gesehen. – phoenix

+0

Brillante Antwort, kurz, prägnant, auf den Punkt –

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

ist nicht das gleiche wie

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

Im zweiten Fall die Bar im Rahmen der Parameter ist, so dass Sie es auf sich selbst zuweisen. this.bar bleibt null.

1

Persönliche Präferenz, aber ich verwende es, um Mehrdeutigkeiten nur zu lösen, und ich nehme in dem sehr seltenen Fall an, dass es offensichtlich ist, dass die zugewiesene Variable ein Feld ist. Es gibt einige Projekte, in denen Leute "this.field" für jeden einzelnen Feldbezug verwenden. Ich finde diese Praxis visuell ablenkend bis zu dem Punkt, dass sie anstößig ist, aber Sie sollten bereit sein, solchen Code ab und zu zu sehen.

Ich denke insgeheim, es gibt einen besonderen Platz in der Hölle für Leute, die 500 Zeilen-Klassen schreiben, die 275 'diese' Schlüsselwörter in ihnen haben, aber dieser Stil ist in einigen Open-Source-Projekten zu finden.

+0

+1 Wenn Sie mit diesem. * Überall sehr nervig.Wenn Sie eine moderne IDE verwenden und Klassen richtig entwerfen, werden Sie nie in eine Situation geraten, wo Sie müssen herauszufinden, was die referenzierte Variable ist (Attribut, lokale Variable usw.) – helpermethod

2

Ich versuche immer this Schlüsselwort auf lokalen Klassenobjekte zu verwenden.

Ich verwende es, um mich visuell zu erinnern, ob ein Objekt ein statisches Objekt oder ein Klassenobjekt ist.

Es hilft mir und dem Compiler zwischen method args und lokalen Klassenobjekt zu unterscheiden.

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

Es hilft mir, mich visuell zu erinnern, wenn es ein solches lokales Objekt in einer inneren/geschachtelte/anonyme Klasse ist es zu unterscheiden von Klassenobjekten eingekapselt wird. Denn wenn es nicht this Präfix ist, wird mein Konvention mich daran erinnern, dass es eine Aufgabe der Einkapselung Klasse ist

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 Schlüsselwort zum Objekt der Klasse verweist, auf denen einige Methode aufgerufen wird.
Zum Beispiel:

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(); 
    } 
} 

Hier in Abc() wir Xyz() fordern die .. Objekt von ABC-Klasse muss also wir this statt neuer Abc() passieren kann, denn wenn wir neue Abc() hier passieren wird es sich wieder anrufen und nochmal.

Auch wir verwenden dies, um Variablen der Klasse und lokale Variablen der Methode zu unterscheiden. z.B

class Abc { 
    int a; 

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

Hier ist this.a bezieht sich eine Klasse von Abc variabel. Daher die gleiche Wirkung wie Sie neue Abc().a; verwenden.

So können Sie sagen this bezieht sich auf Objekt der aktuellen Klasse.

0

Verwenden Sie es zum Klonen von Objekten (durch Übergabe der Referenz von selbst durch einen Kopierkonstruktor).

Nützlich für Objekt, das Cloneable erbt.

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; 
} 

hier this ist ein Schlüsselwort verwendet, wenn Instanzvariable ist die gleiche wie die lokale Variable ist.
eine andere Verwendung von this ist Konstruktor überladen. Es kann den Konstruktor in einem überladenen Konstruktor aufrufen.

7

Es ist üblich,dieses Stichwort in expliziten Konstruktor-Aufruf verwendet werden. Sie können ein Beispiel von der documentation sehen.

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; 
    } 
    ... 
} 
Verwandte Themen