it-swarm.com.de

Warum sollte man lokale Variablen und Methodenparameter in Java als "final" markieren?

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"; 
}

Dies führt dazu, dass x und qwerty im Hauptteil der Methode nicht neu zugeordnet werden können.

Durch diese Vorgehensweise wird Ihr Code in Richtung Unveränderlichkeit verschoben, was im Allgemeinen als Pluspunkt angesehen wird. Aber es neigt auch dazu, den Code zu überladen, wobei "final" überall auftaucht. Wie beurteilen Sie das letzte Schlüsselwort für lokale Variablen und Methodenparameter in Java?

57
Julien Chastang

Sie sollten versuchen, dies zu tun, wann immer es angebracht ist. Neben dem Zweck, Sie zu warnen, wenn Sie "versehentlich" versuchen, einen Wert zu ändern, werden dem Compiler Informationen bereitgestellt, die zu einer besseren Optimierung der Klassendatei führen können. Dies ist einer der Punkte in dem Buch "Hardcore Java" von Robert Simmons Jr. Tatsächlich widmet sich das Buch in seinem gesamten zweiten Kapitel der Verwendung von final, um Optimierungen voranzutreiben und Logikfehler zu vermeiden. Statische Analyse-Tools wie PMD und das integrierte SA of Eclipse kennzeichnen diese Art von Fällen aus diesem Grund.

53
rjray

Meine persönliche Meinung ist, dass es Zeitverschwendung ist. Ich glaube, dass das visuelle Durcheinander und die zusätzliche Ausführlichkeit es nicht wert sind.

Ich war noch nie in einer Situation, in der ich eine fehlerhafte Variable neu zugewiesen habe (denken Sie daran, dass dies Objekte nicht unveränderlich macht, sondern lediglich bedeutet, dass Sie keinen anderen Verweis auf eine Variable neu zuweisen können).

Aber es ist natürlich alles eine persönliche Vorliebe ;-)

27
SCdF

Finalisieren eines Parameters garantiert dass der an einer beliebigen Stelle in der Methode verwendete Wert auf den übergebenen Wert verweist. Andernfalls müssen Sie den gesamten Code über einer bestimmten Position mental analysieren, um zu wissen, welchen Wert der Parameter zu diesem Zeitpunkt hat.

Daher macht nicht using final Ihren Code für sich allein weniger lesbar und wartbar :)

Die endgültigen lokalen Variablen hängen von der Absicht ab und sind aus meiner Sicht weniger wichtig. Kommt drauf an, was los ist.

Bei lokalen Variablen tendiere ich dazu, dies zu vermeiden. Es verursacht visuelle Unordnung und ist im Allgemeinen unnötig - eine Funktion sollte kurz genug sein oder sich auf einen einzelnen Einschlag konzentrieren, damit Sie schnell erkennen, dass Sie etwas modifizieren, das nicht sein sollte.

Im Fall von magischen Zahlen würde ich sie sowieso als ein konstantes privates Feld anstatt in den Code einfügen.

Ich verwende final nur in Situationen, in denen es erforderlich ist (z. B. Übergabe von Werten an anonyme Klassen).

6
Uri

Aufgrund der (gelegentlich) verwirrenden Natur von Javas " pass by reference " - Verhalten stimme ich definitiv der Finalisierung von Parameter-Var zu.

Das Finalisieren lokaler Var's scheint IMO etwas übertrieben.

5
javamonkey79

Ja mach das.

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

Eine vernünftige Alternative besteht darin, die Warnung IDE) einzuschalten, wenn ein Parameter zugewiesen wird oder wenn eine Variable (die keine Schleifenvariable ist) mehr als einmal zugewiesen wird.

3
Craig P. Motlin

Obwohl es ein wenig Unordnung schafft, lohnt es sich, final zu setzen. IDs, z. B. Eclipse, können das final automatisch einfügen, wenn Sie dies konfigurieren.

2
fastcodejava

Das Erstellen von lokalen Variablen und Methodenparametern final ist unerlässlich, wenn Sie diese Parameter an anonyme Klassen übergeben möchten - wie Sie einen anonymen Thread instanziieren und auf diese Parameter im Hauptteil der run () -Methode zugreifen möchten.

Abgesehen davon bin ich mir nicht sicher, welche Leistungsvorteile durch Compileroptimierung erzielt werden. Es liegt an der konkreten Compiler-Implementierung, ob diese überhaupt optimiert werden soll ...

Es ist gut zu wissen, welche Leistungsstatistiken bei der Verwendung von final auftreten.

2
kartheek

das Finale hat drei gute Gründe:

  • vom Konstruktor gesetzte Instanzvariablen werden nur unveränderlich
  • methoden, die nicht überschrieben werden sollen, werden endgültig. Verwenden Sie dies aus realen Gründen, nicht standardmäßig
  • lokale Variablen oder Parameter, die in anonymen Klassen innerhalb einer Methode verwendet werden sollen, müssen final sein

Ebenso wie Methoden müssen lokale Variablen und Parameter nicht als final deklariert werden. Wie bereits erwähnt, wird der Code dadurch unübersichtlich, und die Performance des Compilers lässt sich kaum optimieren. Dies ist für die meisten Codefragmente kein wirklicher Grund.

2
Arne Burmeister

Ich überlasse es Eclipse, dies für mich zu tun, wenn sie in einer anonymen Klasse verwendet werden, was aufgrund meiner Verwendung der Google Collection-API zunimmt.

0

Wir tun dies hier für die lokalen Variablen, wenn wir glauben, dass sie nicht neu zugewiesen werden oder nicht neu zugewiesen werden sollten.

Die Parameter sind nicht endgültig, da wir einen Checkstyle-Check haben, der nach neu zugewiesenen Parametern sucht. Natürlich würde niemand jemals eine Parametervariable neu zuweisen wollen.

0
boutta

Warum würdest du wollen? Sie haben die Methode geschrieben, sodass jeder, der sie modifiziert, das letzte Schlüsselwort immer aus qwerty entfernen und neu zuweisen konnte. Was die Methodensignatur anbelangt, so habe ich dieselbe Überlegung, auch wenn ich nicht sicher bin, was dies für Unterklassen Ihrer Klasse tun würde. Sie erben möglicherweise den finalen Parameter und können x nicht de-finalisieren, selbst wenn sie die Methode überschreiben. Probieren Sie es aus und finden Sie heraus, ob es funktionieren würde.

Der einzige wirkliche Vorteil besteht also darin, dass Sie den Parameter unveränderlich machen und ihn auf die Kinder übertragen. Ansonsten ist Ihr Code nur aus nicht besonders guten Gründen unübersichtlich. Wenn es niemanden zwingt, Ihre Regeln zu befolgen, hinterlassen Sie am besten nur einen guten Kommentar, warum Sie diesen Parameter oder diese Variable nicht ändern sollten, anstatt den finalen Modifikator anzugeben.

Bearbeiten

Als Antwort auf einen Kommentar möchte ich hinzufügen, dass es dem Compiler möglich sein kann, den Code besser zu optimieren, wenn Sie Leistungsprobleme feststellen, indem Sie Ihre lokalen Variablen und Parameter als endgültig festlegen. Unter dem Gesichtspunkt der Unveränderlichkeit Ihres Codes stehe ich jedoch zu meiner ursprünglichen Aussage.

0
Elie