Warum sollte man lokale Variablen und Methodenparameter als „final“ in Java markieren? [geschlossen]

StackOverflow https://stackoverflow.com/questions/316352

  •  11-07-2019
  •  | 
  •  

Frage

In Java können Sie lokale Variablen und Methodenparameter mit dem Schlüsselwort final qualifizieren.

public static void foo(final int x) {
  final String qwerty = "bar"; 
}

Doing so ergibt nicht in der Lage, x und QWERTY im Körper des Verfahrens neu zuzuweisen.

Diese Praxis stößt Code in Richtung Unveränderlichkeit, die im Allgemeinen ein Plus angesehen wird. Aber, es neigt auch dazu, verunstaltet Code mit „final“ überall auftauchen. Was ist Ihre Meinung des endgültigen Schlüsselwort für lokale Variablen und Methodenparameter in Java?

War es hilfreich?

Lösung

Sie sollten versuchen, dies zu tun, wann immer es angebracht ist. Außerdem dienen Sie zu warnen, wenn Sie „versehentlich“ versuchen, einen Wert zu ändern, liefert er Informationen an den Compiler, die eine bessere Optimierung der Klassendatei führen kann. Dies ist einer der Punkte in dem Buch „Hardcore Java“ von Robert Simmons, Jr. In der Tat verbringt das Buch alle seine zweiten Kapitel über die Verwendung des letzten Optimierungen zu fördern und logische Fehler zu vermeiden. Statische Analyse-Tools wie PMD und die integrierten SA von Eclipse Flagge dieser Art von Fällen aus diesem Grunde.

Andere Tipps

Meine persönliche Meinung ist, dass es eine Verschwendung von Zeit ist. Ich glaube, dass die visuelle Unordnung und hinzugefügt Ausführlichkeit ist es nicht wert.

Ich habe noch nie in einer Situation, wo ich neu zugewiesen haben (denken Sie daran, bedeutet dies nicht Objekte unveränderlich machen, heißt es nur, dass Sie nicht einen anderen Verweis auf eine Variable neu zuweisen kann) eine Variable in Fehler.

Aber natürlich, es ist alles persönliche Präferenz; -)

Erstellen eines Parameter final Garantien , dass der Wert an einem beliebigen Stelle in dem Verfahren verwendet wird, bezieht sich auf den Wert übergeben. Ansonsten müssen Sie mental den gesamten Code über einem bestimmten Ort zu analysieren zu wissen, welchen Wert der Parameter an diesem Punkt hat.

So nicht final mit macht den Code weniger lesbar und wartbar, ganz von selbst:)

Endgültige lokale Variablen sind abhängig von der Absicht und sind weniger wichtig in meiner Sicht. Hängt davon ab, was vor sich geht.

Im Fall von lokalen Variablen, neige ich dazu, dies zu vermeiden. Es bewirkt, dass visuelle Unordnung, und ist in der Regel nicht notwendig -. Eine Funktion kurz genug sein sollte, oder auf einer einzigen Auswirkungen konzentrieren Sie schnell sehen zu lassen, dass Sie etwas ändern, die nicht sein sollte

Im Fall der magischen Zahlen, ich würde sie als Konstante privaten Bereich setzt ohnehin eher als im Code.

ich nur Endverwendung in Situationen, in denen es notwendig ist (zum Beispiel Werte für anonyme Klassen vorbei).

Aufgrund der (gelegentlich) verwirrend Natur von Java „ durch Bezugnahme pass“ Verhalten ich stimme definitiv mit dem Parameter var die Finalisierung.

Finalisierung lokale var der scheint etwas übertrieben meiner Meinung nach.

Ja es tun.

Es geht um die Lesbarkeit. Es ist einfacher, über die möglichen Zustände des Programms zur Vernunft, wenn Sie wissen, dass Variablen einmal zugewiesen und nur einmal.

Eine ordentliche Alternative ist auf der IDE Warnung zu drehen, wenn ein Parameter zugeordnet ist, oder wenn eine Variable (außer einem Schleifenvariable) mehrfach vergeben wird.

final hat drei gute Gründe:

  • Instanzvariablen gesetzt durch Konstruktor nur unveränderlich werden
  • Methoden nicht außer Kraft gesetzt werden, endgültig wird, verwenden Sie diese mit realen Gründen nicht standardmäßig
  • lokale Variablen oder Parameter innerhalb einer Methode in anonimous Klassen werden müssen endgültig sein

Wie Methoden, lokale Variablen und Parameter müssen nicht final deklariert werden. Wie schon andere gesagt, der Code dieses clutters mit sehr wenig efford für Compiler Performace Optimierung weniger lesbar wird, ist dies kein wirklicher Grund für die meisten Codefragmente.

Auch wenn es ein wenig Unordnung schafft, ist es wert, final. Ides beispiel Eklipse kann automatisch die final setzen, wenn Sie es so konfigurieren, dies zu tun.

Erstellen lokale Variablen und Methodenparameter final ist wichtig, wenn Sie diese Parameter in anonyme Klassen übergeben wollen -. Wie man ein anonymes Thema instanziiert und will diese params in dem Körper der run () Methode für den Zugriff auf

Abgesehen davon, dass ich bin nicht sicher, ob die Leistungsvorteile w.r.t bessere Leistung durch Compiler-Optimierung. Es liegt an der spezifischen Compiler Implementierung, ob es will, es optimieren überhaupt ...

Es wird gut sein von irgendwelchen Leistungsstatistiken zu wissen, von der Verwendung final ...

Warum würden Sie wollen? Sie schrieb das Verfahren, so dass jeder es könnte immer entfernen Sie das letzte Schlüsselwort aus QWERTY modifizieren und neu zuweisen. Wie für die Methodensignatur, die gleiche Argumentation, obwohl ich nicht sicher bin, was es zu Subklassen der Klasse tun würde ... können sie die letzten Parameter erben und auch wenn sie die Methode überschreiben, nicht in der Lage x de-finalisieren. Probieren Sie es aus und finden Sie heraus, ob es funktionieren würde.

Der einzige wirkliche Vorteil ist dann, wenn Sie die Parameter unveränderlich machen und es trägt die Kinder über. Ansonsten sind unübersichtlich Sie nur Ihren Code für keinen besonders guten Grund. Wenn es niemanden zwingen, Ihre Regeln zu folgen, sind Sie besser dran, nur einen guten Kommentar, wie Sie zu verlassen, warum sollen Sie nicht, dass die Parameter oder eine Variable ändern, anstatt zu geben, wenn die endgültige Modifier.

Bearbeiten

Als Reaktion auf einen Kommentar, werde ich hinzufügen, dass, wenn Sie Performance-Probleme sehen, so dass Ihre lokalen Variablen und Parameter endgültig der Compiler den Code besser optimieren lassen können. Doch aus der Perspektive der Unveränderlichkeit des Codes, ich stehe zu meiner ursprünglichen Aussage.

Ich ließ Eklipse es für mich tun, wenn sie in einer anonymen Klasse verwendet werden, die aufgrund meiner Verwendung von Google-Sammlung API nehmen zu.

Wir machen es hier für die lokalen Variablen, wenn wir denken, werden sie nicht neu zugewiesen werden, oder sollten nicht neu zugewiesen werden.

Die Parameter sind nicht endgültig, da wir einen Check-Check haben, die für die Neuzuweisung von Parametern überprüft. Natürlich würde niemand jemals einen Parameter Variable neu zuweisen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top