2010-03-22 4 views
7

Ich lese ein Buch über Java. Es muss nur erklärt werden, wie Sie eine Klasse namens "Deck" erstellen, die ein Array von Karten als Instanzvariable (n) enthält. Hier ist der Code snippit:Warum ist das nicht "das"? Befehl in diesem Konstruktor benötigt? (Java)

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     cards = new Card[n]; 
    } 
} 

warum nicht die this. Befehl? warum

zum Beispiel ist nicht der Code folgendermaßen aus:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     this.cards = new Card[n]; 
    } 
} 
+0

Sie haben einen Fehler im zweiten Beispiel. Es gibt 2 '['. –

+0

Hinweis: Wenn Sie darüber diskutieren wollen, ob es eine gute Idee ist, das 'This' zu verwenden oder wegzulassen, dann gibt es viele andere Orte, um darüber zu debattieren. Siehe zum Beispiel diese Frage: http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java –

Antwort

12

this. ist implizit.

Im Allgemeinen ist es eine Best Practice (mindestens I betrachten Sie es), nur this zu verwenden, wenn absolut notwendig. Wenn Sie eine lokale Variable mit dem Namen cards und eine Membervariable mit dem Namen cards haben, benötigen Sie beispielsweise this.cards, um auf die Elementvariable zu verweisen, da sich cards auf die lokale Variable bezieht.

In solch einem Fall ist this eine gute Idee (obwohl es eine bessere Idee wäre, die Elementvariable umzubenennen).

In jedem anderen Fall, in dem eine implizite this funktionieren kann, verwenden Sie sie.

+0

kann dies. immer dann weggelassen werden? oder meinst du, dass der Autor es beabsichtigt, da zu sein, aber es nicht schreibt, weil es implizit relativ zum Leser ist? – David

+0

@David: Es kann immer weggelassen werden, es sei denn, Sie haben auch eine lokale Variable mit dem gleichen Namen (da dann 'cards' allein die lokale Variable und nicht die Instanzvariable wäre und Sie' this.cards' benötigen würden referenziere explizit die Instanz). – Chris

+0

@David, @Chris Smith: Heh ... Ich habe gerade bearbeitet, als du kommentiert hast. – Randolpho

1

Das Schlüsselwort "this" ist in diesem Fall überflüssig. Karten sind bereits im Klassenumfang definiert und der Compiler weiß, dass das Mitglied Teil dieser "Klasse" ist.

2

This ist impliziert.

sie erarbeiten:

class Deck { 
    Card[] cards; 
    public Deck (Card[] cards) { 
      this.cards = cards; 
    } 
} 

In diesem Fall, dass Sie in einer Reihe von Karten übergeben, die die gleichen Namen wie die Anordnung von Karten des Objekts teilt. This bezieht sich auf das Datamember Ihres Objekts, nicht auf den Parameter des Konstruktors.

0

"dies" ist impliziert. Es besteht keine Notwendigkeit, "das" zu verwenden. Normalerweise lege ich es dort hin, um den Code lesbar zu machen, aber es ist auch nicht nötig.

20

Weil es keine Zweideutigkeit gibt. Es gibt nur eine cards Variable. this würde benötigt, wenn es zwei - eine davon wäre eine Instanzvariable (Teil der Klasse, wie es derzeit ist), und die andere - ein Argument des Konstruktors.

Und btw, this ist kein "Befehl". Es ist ein "Schlüsselwort".

3

Wenn Sie den Bezeichner cards im Konstruktor verwenden, erkennt der Compiler, dass das Feld (a.k.a.Membervariable) cards im Bereich ist und verwendet es. this.cards wäre nur erforderlich, um Mehrdeutigkeiten aufzulösen, zum Beispiel, wenn Sie auch eine lokale Variable oder einen Parameter mit dem Namen cards hätten.

3

Es wäre sinnvoll, wenn Sie auch einen Parameter namens cards haben. Dann würde this.cards angeben, dass Sie genau das Feld cards der Klasse meinen, nicht den Parameter.

Aber trotzdem ist es eine gute Praxis, this. in Fällen zu verwenden, wie in Ihrem Beispiel beschrieben.

+3

Nein, es ist keine gute Übung, Ihrem Quellcode optisches Rauschen hinzuzufügen. – Bombe

+2

@ Bombe: Das hängt davon ab, wen Sie fragen. * Einige * Leute denken, 'this.' zu empfehlen, während andere dies nicht tun. –

+0

In der Tat. Also, es ist keine gute Übung, weil es sowieso keine guten Praktiken gibt. :) – Bombe

4

Das this Referenz des Objekts wird angedeutet, aber es kann sinnvoll sein, aus Gründen der Klarheit (für Disambiguierung zwischen einem Mitglied des Objekts und einer lokalen Variablen mit dem gleichen Namen, wie in dem Konstruktor unten notwendig und es ist):

public class Foo { 
     final private int x; 

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

     public int getX() { return this.x; } 
    } 
8

Sie müssen nicht alle Zugriffe auf Mitglieder mit dem Schlüsselwort this qualifizieren. Sie müssen es nur verwenden, wenn eine andere Variable die Member-Methode versteckt.

Und das ist kein Merkmal für den Konstruktor beschränkt, sondern in allen Methoden:

public class Test 
{ 
    private int member; 
    private int value; 
    public Test(int value) { 
     member = 5; 
     this.value = value; // required to differentiate from the parameter 
    } 
    public void f(int member) { 
     int value = 5 
     this.member = value; // assign local 'value' (5) to member 'member' 
     this.value = member; // assign parameter 'member' to member 'value' 
    } 
} 
0

Ich versuche, Variablennamen in einer Art und Weise zu wählen, die nicht die „dieses“ Schlüsselwort erfordert. Das heißt, wenn ich eine Eigenschaft namens "value" habe, werde ich zu einem Parameter namens val übergehen.

Eine gute Verwendung des Schlüsselworts "this" dient zum Überladen von Konstruktoren. Betrachten Sie die folgende (Ich werde diese verwenden, um die Differenz zu demonstrieren.):

public class Person 
{ 
    int age; 
    public Person(int age) 
    { 
     this.age=age; 
    } 
    public Person() 
    { 
     this(25); //default age 
    } 
} 

Wenn überhaupt möglich ist, werde ich versuchen, die Eigenschaft und Parameter den gleichen Namen zu vermeiden, um zu vermeiden, was Sie auf Linie zu sehen 6. Jedoch Die Verwendung des this-Schlüsselworts zum Aufrufen eines anderen Konstruktors ist eine gute Möglichkeit, die Duplizierung von Code zu verhindern. Dies ist ein triviales Beispiel, aber wenn Sie anfangen, sich selbst mit Konstruktoren zu finden, die viele der gleichen Arbeit mit kleinen Unterschieden zwischen ihnen tun, ist es sehr praktisch.

Verwandte Themen