2013-04-05 7 views
19

Mein Lehrer sagt, dass wenn ich versuche, auf eine Instanzvariable innerhalb einer Methode zuzugreifen, ich immer das this Schlüsselwort verwenden sollte, sonst würde ich eine doppelte Suche durchführen. Eine lokale Bereichsuche und dann eine Instanzbereichsuche.Sollte ich das Schlüsselwort "this" verwenden, wenn ich innerhalb einer Methode auf Instanzvariablen verweisen möchte?

Beispiel:

public class Test(){ 
    int cont=0; 
    public void Method(){ 
     System.out.println(cont);//Should I use This.cont instead? 
    } 
} 

Ich hoffe, dass er falsch ist, aber ich kann kein Argument finden.

+0

@LuiggiMendoza: ok getan –

+11

* "Double-Suche *" ??? Erkennt Ihr Lehrer, dass die Namenssuche zur Kompilierzeit durchgeführt wird? – Pubby

+2

@HovercraftFullOfEels Warum sagst du zu _only_ benutze es dann? (Oder meintest du, dass du _nicht_ brauchst, um es dann zu benutzen?) – cheeken

Antwort

30

Nein, verwenden Sie nur this, wenn Sie einen Namenskonflikt haben, z. B. wenn ein Methodenparameter den gleichen Namen wie ein Instanzfeld hat, das er definiert.

Es kann zu anderen Zeiten verwendet werden, aber viele von uns glauben, dass es einfach unnötige Worte zum Code hinzufügt.

+4

Diese Art von Code ist schlecht lesbar. Verwenden Sie immer 'this'. Andernfalls, wenn ein Leser einen Verweis auf eine Variable sieht, fragt er sich, ob es sich um eine lokale oder eine Instanzvariable handelt. – MohamedEzz

+2

@MohamedEzz: Wir stimmen zu, nicht zu stimmen, aber ich respektiere Ihre Meinung, und es ist völlig in Ordnung mit Ihrem Down-Vote, da es getan wurde, was Sie glauben, ist ein triftiger Grund und für Ihre Kommentare dazu. Mit freundlichen Grüßen, danke für Ihre Kommentare. –

+0

Ich bin mit Hovercraft - vor allem, wenn Sie Code schreiben, der sauber, gut strukturiert und zusammenhängend ist, sollte es jedem kompetenten Programmierer klar sein, dass eine Variable ein Mitglied ist. Zweitens machen IDEs die Identifizierung von Elementvariablen wegen der Farbcodierung trivial. – ayahuasca

0

this gilt nur für den Fall, dass ein Parameter den gleichen Namen wie eine Klasseneigenschaft hat.

public class Dog { 
    String name; 
    public Dog(String name) { 
     name = name; //but which name? Are we just assigning a variable to itself? 
     // here you could say this.name = name. Or you could rename one of the variables to resolve ambiguity 
    } 
} 
0

Ich benutze this gelegentlich wegen Auto-Vervollständigung (das Leben leichter macht), aber ich sie danach aufzuräumen.

Denken Sie daran, Klarheit ist der Schlüssel. In diesem Fall ist es offensichtlich, dass cont eine Klassenvariable ist. Wenn Sie jedoch eine enorme Klasse mit Häufchen von Instanzvariablen schreiben, können Sie die Verwendung von this aus Gründen der Übersichtlichkeit in Betracht ziehen.

Sie auch nur müssenthis verwenden, wenn es eine Namenskollision gibt, z.

In diesem Beispiel würde "num = num" eine Kollision verursachen, "this" vermeidet dies. Dies ist das einzige Mal, dass es absolut notwendig ist, aber auch hier ist oft Klarheit eine höhere Priorität.

+1

Ich bin mir nicht sicher, welche IDE Sie verwenden, aber ich weiß, dass es bei Eclipse nicht nötig ist, 'this' bei der automatischen Vervollständigung zu verwenden, da ctrl-space die Autokomplettierung ohne' this' anzeigt. –

+0

@HovercraftFullOfEels Hmm, das habe ich mir nie wirklich angeschaut. Ich benutze NetBeans; nicht sicher, was die Abkürzung dort ist. Ich muss mich darum kümmern! – Zyerah

2

this ist ein Alias ​​oder ein Name für die aktuelle Instanz innerhalb der Instanz. Es ist nützlich, um Instanzvariablen aus lokalen Variablen (einschließlich Parametern) zu unterscheiden, aber es kann für sich selbst verwendet werden, um einfach auf Membervariablen und Methoden zu verweisen, andere Konstruktorüberladungen aufzurufen oder einfach auf die Instanz zu verweisen.
Siehe Java - when to use 'this' keyword
Auch Dies bezieht sich auf das aktuelle Objekt. Wenn Sie eine Klasse mit Variablen haben int A und eine Methode xyz Teil der Klasse hat int A, nur um zu unterscheiden, welche "A" Sie beziehen, verwenden Sie dies.A. Dies ist nur ein Beispielfall.

public class Test 
{ 
int a; 

public void testMethod(int a) 
{ 
this.a = a; 
//Here this.a is variable 'a' of this instance. parameter 'a' is parameter. 
} 
} 

Sie können also sagen, dass
dieses Schlüsselwort kann verwendet werden (es nicht mit statischen Methoden verwendet werden können):

 1)To get reference of an object through which that method is 
     called within it(instance method). 
     2)To avoid field shadowed by a method or constructor parameter. 
     3)To invoke constructor of same class. 
     4)In case of method overridden, this is used to invoke method of current class. 
     5)To make reference to an inner class. e.g ClassName.this 
+0

Können Sie ein Beispiel zu 4) Im Falle der Methode überschrieben, wird dies verwendet, um Methode der aktuellen Klasse aufzurufen. Versucht, es zu testen, kann aber keine Situation erkennen, in der es gültig ist. – brnfd

+0

Teilen Sie Ihren Code als Frage, wahrscheinlich erhalten Sie die Antwort – Freak

19

Sie Muss Verwendung this wenn wegen eines Namenskonflikt erforderlich obwohl es besser ist, diese vollständig zu vermeiden.

Sie könnenthis verwenden, wenn Sie es wünschen. Es ist reine Geschmackssache.

Sie sollten verwenden Sie this in Ihrer Schule, wenn Ihr Lehrer es verlangt.

+2

+1 für Hinweise auf den größeren Punkt: Jede Umgebung, in der Sie arbeiten, wird Codierung Konventionen haben, und Sie sollten ihnen folgen, auch wenn Sie sie nicht mögen, weil Gleichmäßiger Code ist einfacher für die Augen. Wenn die Vereinbarung des Lehrers immer "dieses" verwenden soll, sei es so. (Aber es gibt keine doppelte Suche.) – yshavit

+0

@yshavit Ich denke, es geht hier nicht um die Konvention. Es geht um den (falschen) Grund, den der Lehrer gibt. Wenn es etwas mit der Konvention des Lehrers zu tun gehabt hätte, hätten sie das erwähnt oder hätten nichts gesagt. Der Lehrer ist einfach falsch. Sie könnten dem Schüler dafür danken, dass er sie korrigiert hat. – Solace

1

Da alle Beispiele disambiguating Namen gegeben hat, werde ich ein Beispiel geben, wenn this Hilfe bei der Verwendung:

public class Person { 
    private final firstName; 
    private final lastName; 
    private final Date birthdate; 
    private final Address address; 

    @Override 
    public boolean equals(Object otherObject) { 
     if (!(otherObject instanceof Person) { 
      return false; 
     } 

     Person otherPerson = (Person) otherObject; 

     // Using this here help distinguishing the current instance and the other. 
     return this.firstName.equals(otherPerson.firstName) 
      && this.lastName.equals(otherPerson.lastName) 
      && this.birthdate.equals(otherPerson.birthDate) 
      && this.address.equals(otherPerson.address); 
    } 

} 
2

Ihr Lehrer ist richtig, dass es in Doppel Suche nach Compiler führt, wenn Sie keinen Gebrauch machen können von this Schlüsselwort. Zuerst sucht der Compiler den lokalen Bereich und dann den Instanzbereich, wenn der Compiler die Variable nicht im lokalen Bereich finden kann.

Während der Compiler Ihren Code in Bytecode konvertiert, wird der Compiler allen Instanzvariablen das Präfix this voranstellen. Wenn Sie also selbst das Schlüsselwort this verwenden, reduzieren Sie die Belastung für den Compiler und der Code wird schneller kompiliert.

+4

Ich würde den Compiler nicht bedauern. Ich meine, ich lasse auch meine Kommentare streichen! –

+1

Ich stimme dir zu. Es ist nur ein persönlicher Geschmack. Eine andere Sache ist, dass, wenn der Code lang wird, auch die Verständlichkeit des Codes für die neue Person verbessert wird, um zu verstehen, dass Sie eine Instanzvariable und keine lokale Variable verwenden. – user1190882

0

Eine andere Stelle, die this häufig für Lesbarkeit verwendet wird, ist, wenn ein inneres Klassenobjekt auf ein Feld seines enthaltenden Objekts verweist.

public class Foo { 

    String foostring; 
    /* snip lots of code */ 
    private class Foohelper { 
     void helperMethod(String bazstring) { 
      Foo.this.foostring = bazstring; 
      // etc. 
     } 
    } 
} 

Der Compiler ist dies nicht brauchen, aber es macht die Situation für foostring mehr klar zu sehen, wo. Anders als dies (!) Qualifiziere ich Feldnamen im Konstruktor nur voll, wo sie möglicherweise durch Parameternamen verborgen sind, wie viele andere Poster hier gezeigt haben.

[Edit:. Jetzt, wo ich darüber nachdenke, gibt es Orte der Compiler benötigt dies, zum Beispiel, wenn Foohelper.toString() will Foo.toString() anrufen]