366 Stimmen

Wann sollte ich "dies" in einer Klasse verwenden?

Ich weiß, dass this bezieht sich auf ein aktuelles Objekt. Aber ich weiß nicht, wann ich es wirklich brauchen werde. Gibt es zum Beispiel einen Unterschied, wenn ich x 代わりに this.x in einigen der Methoden? Kann sein x auf eine Variable verweisen wird, die für die betreffende Methode lokal ist? Ich meine eine Variable, die nur in dieser Methode zu sehen ist.

Was ist mit this.method() ? Kann ich es verwenden? Sollte ich es verwenden. Wenn ich nur method() wird sie dann nicht standardmäßig auf das aktuelle Objekt angewendet?

15voto

Benjamin Punkte 151

"this" ist auch nützlich, wenn ein Konstruktor von einem anderen aufgerufen wird:

public class MyClass {
    public MyClass(String foo) {
        this(foo, null);
    }
    public MyClass(String foo, String bar) {
        ...
    }
}

13voto

Kieren Dixon Punkte 947

this ist für das Builder-Muster nützlich.

public class User {

    private String firstName;
    private String surname;

    public User(Builder builder){
        firstName = builder.firstName;
        surname = builder.surname;
    }

    public String getFirstName(){
        return firstName;
    }

    public String getSurname(){
        return surname;
    }

    public static class Builder {
        private String firstName;
        private String surname;

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setSurname(String surname) {
            this.surname = surname;
            return this;
        }

        public User build(){
            return new User(this);
        }

    }

    public static void main(String[] args) {
        User.Builder builder = new User.Builder();
        User user = builder.setFirstName("John").setSurname("Doe").build();
    }

}

8voto

ChickenMilkBomb Punkte 957

Es sei denn, Sie haben überlappende Variablennamen, es ist wirklich nur für Klarheit, wenn Sie den Code lesen.

4voto

Ravindra babu Punkte 45577

Die Antwort von @William Brendel lieferte auf nette Art und Weise drei verschiedene Anwendungsfälle.

Anwendungsfall 1:

Offizielle Java-Dokumentationsseite auf cette bietet dieselben Anwendungsfälle.

Innerhalb einer Instanzmethode oder eines Konstruktors ist dies ein Verweis auf das aktuelle Objekt - das Objekt, dessen Methode oder Konstruktor gerade aufgerufen wird. Sie können innerhalb einer Instanzmethode oder eines Konstruktors auf jedes Mitglied des aktuellen Objekts verweisen, indem Sie dies verwenden.

Sie umfasst zwei Beispiele:

Dies mit einem Feld verwenden y Dies mit einem Konstruktor verwenden

Anwendungsfall 2:

Andere Anwendungsfälle, die in diesem Beitrag nicht genannt wurden: this kann verwendet werden, um das aktuelle Objekt in einer Multi-Thread-Anwendung zu synchronisieren, um kritische Abschnitte von Daten und Methoden zu schützen.

synchronized(this){
    // Do some thing. 
}

Anwendungsfall 3:

Durchführung von Bauherr Muster hängt von der Verwendung von this um das geänderte Objekt zurückzugeben.

Siehe diesen Beitrag

Beibehaltung des Builders in einer eigenen Klasse (fließende Schnittstelle)

2voto

BlairHippo Punkte 9274

Google hat eine Seite auf der Sun-Website gefunden, auf der dies ein wenig diskutiert wird.

Sie haben Recht, was die Variable angeht; this kann tatsächlich verwendet werden, um eine Methodenvariable von einem Klassenfeld zu unterscheiden.

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

Aber ich realmente Ich hasse diese Konvention. Zwei verschiedenen Variablen buchstäblich identische Namen zu geben, ist ein Rezept für Fehler. Ich bevorzuge etwas in der Art von:

    private int x;
    public void setX(int newX) {
        x=newX;
    }

Gleiche Ergebnisse, aber ohne die Möglichkeit eines Fehlers, bei dem man versehentlich auf x wenn Sie in Wirklichkeit meinen, dass Sie sich auf x stattdessen.

Was die Verwendung mit einer Methode angeht, so haben Sie Recht, was die Auswirkungen angeht. Sie werden mit oder ohne Methode die gleichen Ergebnisse erzielen. Kann man es verwenden? Sicher. Sollten Sie es verwenden? Das bleibt Ihnen überlassen, aber da ich persönlich der Meinung bin, dass es sich um eine sinnlose Verschwendung handelt, die nicht zur Klarheit beiträgt (es sei denn, der Code ist mit statischen Import-Anweisungen vollgestopft), bin ich selbst nicht geneigt, es zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X