it-swarm.dev

Was ist der akzeptierte Stil für die Verwendung des Schlüsselworts "this" in Java?

Ich komme aus Sprachen wie Python oder Javascript (und anderen, die weniger objektorientiert sind) und versuche, meine Java-Kenntnisse zu verbessern, die ich nur oberflächlich kenne.

Wird es als schlechte Praxis angesehen, den aktuellen Instanzattributen immer this voranzustellen? Es fühlt sich für mich natürlicher an zu schreiben

...
private String foo;

public void printFoo() {
    System.out.println(this.foo);
}
...

als

...
private String foo;

public void printFoo() {
    System.out.println(foo);
}
...

da es mir hilft, Instanzattribute von lokalen Variablen zu unterscheiden.

Natürlich ist es in einer Sprache wie Javascript sinnvoller, immer this zu verwenden, da mehr Funktionen verschachtelt werden können und daher lokale Variablen aus größeren Bereichen stammen. Soweit ich weiß, ist in Java keine solche Verschachtelung möglich (außer für innere Klassen), daher ist dies wahrscheinlich kein großes Problem.

In jedem Fall würde ich lieber this verwenden. Würde es sich komisch und nicht idiomatisch anfühlen?

38
Andrea

In den meisten IDEs können Sie einfach mit der Maus über die Variable fahren, wenn Sie dies wissen möchten. Wenn Sie in einer Instanzmethode arbeiten, sollten Sie außerdem alle beteiligten Variablen kennen. Wenn Sie zu viele haben oder deren Namen nicht übereinstimmen, müssen Sie eine Umgestaltung vornehmen.

Es ist wirklich ziemlich überflüssig.

41
DeadMG

Ich bevorzuge this. Es erleichtert das Lesen von Code in verschiedenen Editoren, die lokale und Instanzvariablen auf dieselbe Weise färben. Es erleichtert auch das Lesen des Codes auf einer gedruckten Seite während einer Codeüberprüfung. Es ist auch eine ziemlich starke Erinnerung an den Umfang der Variablen für andere Entwickler.

Es gibt jedoch Argumente dagegen. In modernen IDEs können Sie den Umfang einer Variablen ermitteln, indem Sie den Mauszeiger darüber halten oder sie in einer baumartigen Struktur anzeigen. Sie können auch die Farbe und/oder Schriftart von Variablen in Abhängigkeit von ihrem Umfang ändern (auch so, dass beim Drucken der Umfang der Variablen ersichtlich ist).

Ich glaube, dass ChrisFs letzter Satz tot ist: Sei konsequent in deiner Verwendung.

26
Thomas Owens

Ein Ort, an dem ich "dies" konsequent benutze, sind Setter und/oder Konstruktoren:

public void setFoo(String foo) {
    this.foo = foo;
}

Abgesehen davon halte ich es nicht für notwendig, es hinzuzufügen. Beim Lesen des Körpers einer Methode sind Parameter und Einheimische genau dort - und ziemlich einfach zu verfolgen (auch ohne die Hilfe IDE)). Auch Einheimische und Felder sind in der Regel unterschiedlicher Natur ( Objektzustand gegen vorübergehende Speicherung oder Parameter).

Wenn Unklarheiten darüber bestehen, was eine Variable und was ein Feld ist, bedeutet dies wahrscheinlich, dass eine Methode zu viele Variablen/Parameter hat, zu lang und zu komplex ist und vereinfacht werden sollte.

Wenn Sie sich für die Kennzeichnung von Feldern mit "this" entscheiden, würde ich empfehlen, sicherzustellen, dass die Konvention immer strikt eingehalten wird. Es ist sehr einfach anzunehmen, dass "this" kein lokales und fehlerhaftes Material ist, das auf dieser Annahme basiert.

edit: Ich verwende dies auch in equals, clone oder irgendetwas, das einen 'that'-Parameter desselben Objekttyps hat:

public boolean isSame(MyClass that) {
    return this.uuid().equals(that.uuid());
}
18
ptyx

Es ist umstritten.

Nehmen wir C # als Analogie, da es eine sehr ähnliche Syntax und Struktur wie Java hat, dass C # StyleCop eine Standardregel hat, die darauf besteht, dass Sie this hinzufügen, aber ReSharper hat eine Standardregel Regel, die besagt, dass this redundant ist (was es ist) und entfernt werden kann.

Wenn Sie also ein Tool verwenden, fügen Sie sie hinzu, aber wenn Sie ein anderes verwenden, entfernen Sie sie. Wenn Sie beide Tools verwenden, müssen Sie eine der Regeln auswählen und deaktivieren.

Die Regeln bedeuten jedoch, dass Sie in Ihrer Verwendung konsistent sind - was wahrscheinlich das Wichtigste ist.

8
ChrisF

Wird es als schlechte Praxis angesehen, dies immer den aktuellen Instanzattributen voranzustellen?

Ja - von einigen, nein - von anderen.

Ich mag und verwende das Schlüsselwort this in meinen Projekten in Java und C #. Man kann argumentieren, dass IDE Parameter und Felder immer unterschiedlich hervorheben) Farbe jedoch arbeiten wir nicht immer in IDE - wir müssen viele Zusammenführungen/Unterschiede/einige schnelle Änderungen in einem Notizblock vornehmen/einige Code-Schnipsel in E-Mails überprüfen. Es ist - way Es fällt mir leichter, auf den ersten Blick zu erkennen, wo sich der Status der Instanz ändert - zum Beispiel, um einige mögliche Parallelitätsprobleme zu überprüfen.

8
Andrey Taptunov

Ich denke, wenn Sie dies verwenden müssen, haben Sie entweder eine zu lange Methode oder eine Klasse, die versucht, zu viel zu tun, oder beides.

Methoden sollten niemals länger als ein paar Codezeilen sein. Verwenden Sie eine oder zwei lokale Variablen, um zu bestimmen, was einfach wird. Selbst mit nur dem 3-Zeilen-Kontext der meisten Diff-Tools. Wenn Ihre Methoden zu lang sind und Ihre Klassen zu viele Verantwortlichkeiten haben (was häufig zu viele Felder bedeutet), besteht die Lösung darin, sie stattdessen aufzuteilen.

Ich denke, dass "dies" nur den Code durcheinander bringt. Besonders bei modernen IDEs, die lokale Parameter/lokale Variablen/Felder unterschiedlich färben.

7
Eric-Karl

Ich denke, Sie haben Ihre eigene Frage damit beantwortet:

Es fühlt sich für mich natürlicher an zu schreiben

... this.foo ...

als

... foo ...

da es mir hilft, Instanzattribute von lokalen Variablen zu unterscheiden.

Wenn Sie mit this. Besser umgehen können, während Sie Ihre Kenntnisse in Java verbessern, dann verwenden Sie auf jeden Fall das Ding (. Ich denke, es ist in gewisser Weise das Vertraute. Python self , auf das Sie sich beziehen ).

Die Sache ist, dass, obwohl die Leute solide/sachdienliche Argumente über die Verwendung oder Nichtverwendung von this. Geben, es immer noch wie eine Debatte klingt, Beispiel gegeben:

  • es macht den Zweck der Variablen klar vs. Sie sollten den Code neu schreiben, wenn nicht klar ist, was jede Variable ist;
  • this. Ist überflüssig, wenn Sie Ihren ganzen Tag im IDE vs. verbringen. Ich führe Codeüberprüfungen durch und Unterschiede in verschiedenen Versionen mit einem Komparator ohne Syntaxhervorhebung vornehmen;
  • wenn ich nicht this. eingebe, bekomme ich wichtige Millisekunden Produktivität vs. Ich werde per Tastendruck bezahlt und das Hinzufügen von this. ist wie eine Gehaltserhöhung: D;
  • etc etc.

Aber unter dem Strich geht es am Ende des Tages immer noch um die persönlichen Vorlieben und das Arbeitsumfeld .

5
user7197

Normalerweise ist das Hinzufügen dieses nicht erforderlich. Ich denke nicht, dass es per se eine schlechte Praxis ist, aber eine übermäßige Verwendung von dieses würde in den meisten Java Codebasen als ungewöhnlich angesehen Ich habe gesehen.

Ich finde es jedoch in einigen spezifischen Situationen wertvoll:

Überschreiben lokaler Parameter - Manchmal muss angegeben werden, dass Sie eine Instanzvariable anstelle eines gleichnamigen Parameters/einer lokalen Variablen verwenden möchten. Dies ist in Konstruktoren häufig der Fall, in denen der Parametername mit dem internen Namen der Instanzvariablen übereinstimmen soll, mit der er z.

class MyObject {
  int value;

  public MyObject(int value) {
    this.value=value;
  }
}

Wenn Sie andere Instanzen derselben Klasse behandeln - Ich glaube, es macht den Code klarer und verständlicher, wenn Sie explizit angeben, auf welche Instanz der Klasse Sie sich beziehen, z.

class MyObject {
  int value;
  ....

  public MyObject add(MyObject other) {
    return new MyObject( this.value + other.value )
  }
}
5
mikera