2012-05-21 10 views
26

Mögliche Duplizieren:
When should one use final?Ist es eine gute Praxis, Variablen möglichst "final" zu deklarieren?

Ich neige dazu, alle Variablen zu erklären, es sei denn, final notwendig. Ich halte dies für eine gute Vorgehensweise, da es dem Compiler ermöglicht, zu überprüfen, ob der Identifizierer wie erwartet verwendet wird (z. B. ist er nicht mutiert). Auf der anderen Seite stört es den Code, und vielleicht ist das nicht "der Java-Weg".

Ich frage mich, ob es eine allgemein akzeptierte Best Practice in Bezug auf die nicht benötigte Verwendung der endgültigen Variablen gibt, und wenn es andere Kompromisse oder Aspekte zu dieser Diskussion geben sollte, sollte darauf hingewiesen werden.

+1

Die Idee eines optionalen Codes, der die Absicht des Entwicklers ausdrücken kann oder nicht und der zu Compiler-Optimierungen führen kann oder auch nicht, klingt wie etwas aus einem XKCD-Comic. – jordanpg

+0

Große Sache ist, sehr vorsichtig mit dem zu sein, was du final meinst. Endgültige veränderbare Objekte können immer noch modifiziert werden, was einige Neulinge vergessen. Dies ist das große Problem, das ich mit dem Finale wirklich habe, jedes Mal, wenn ich mit einem veränderlichen Objekt arbeite, wird die * Absicht * des Finales schlammig, ich kenne die wörtliche Bedeutung, aber macht die Person, die final verwendet, wirklich okay, den Inhalt des Objekts zu modifizieren obwohl es endgültig ist oder nicht? – dsollen

Antwort

0

Einige gute Analysewerkzeuge, wie PMD, raten, immer final zu setzen, wenn es nicht notwendig ist. Also die Konvention in diesem Werkzeug sagt, es ist eine gute Praxis

Aber ich denke, dass so viele letzte Tokens in Code kann es weniger menschenfreundlich.

10

Ich halte es für gute Praxis, mehr für Wartungsprogrammierer (einschließlich mir!) Als für den Compiler. Es ist einfacher, über eine Methode nachzudenken, wenn ich mir keine Gedanken darüber machen muss, welche Variablen sich darin ändern.

+0

Ja! Das ist ein wirklich guter Punkt. Die Lesbarkeit wird verbessert, weil Sie sofort wissen, dass diese Variable nicht geändert wird. Es macht es einfacher darüber nachzudenken. –

+0

Ich würde dies leicht klären, vor allem für Java-Neulinge, die das vielleicht falsch lesen. Meine erste faule Lektüre ließ mich denken, dass du sagst, dass es einfacher ist, eine existierende Methode zu benutzen, weil du dir keine Sorgen machen musst, dass die Methode irgendetwas ändert, was keinen Sinn macht, da die Final nicht davor schützt. Beim nochmaligen Lesen bin ich mir ziemlich sicher, dass du meinst, wenn du eine existierende Methode liest und herausfindest, was sie macht, ist es leichter, mit einem ihr zugewiesenen Finale zu analysieren, was mehr Sinn macht. Allerdings hätte ich Angst, dass Newbie-Java-Leute es so lesen könnten, wie ich es ursprünglich gemacht habe, und zu neu sein, um zu erkennen, dass das nicht funktioniert. – dsollen

2

Es gibt Ihnen definitiv einen besseren Code, einfach zu sehen, welche Variablen geändert werden.

Es informiert auch den Compiler, dass es sich nicht ändern wird, was zu einer besseren Optimierung führen kann.

Neben ihr ermöglicht es Ihnen Ihre IDE, Kompilierungszeit Benachrichtigung zu geben, wenn Sie dazu neigen, einen Fehler zu machen.

+0

Ich stimme nicht zu. Sie können eine Sammlung als endgültig deklarieren, aber trotzdem können Sie ihre Inhalte ändern ... Das einzige, was Sie nicht tun können, ist eine andere REFERENZ zu vergeben! Ich stimme zu, für Felder bei Bedarf zu verwenden, aber für lokale Methodenvariablen ??? Ihr Umfang sollte begrenzend genug sein ... Das ist nur meine Meinung .. – Lawrence

0

Sie so ziemlich die Vor- und Nachteile zusammengefasst ...

ich eine andere con nur hinzufügen:

der Leser des Codes muss nicht gar über den Wert einer endgültigen Variable zur Vernunft (außer für seltene Fälle mit schlechtem Code).

Also, ja, es ist eine gute Praxis.

Und das Durcheinander ist nicht so schlimm, nachdem Sie sich daran gewöhnt haben (wie Unix :-P). Plus, typische IDEs tun es automatisch für ...

12

Der "Java-Weg" ist inhärent, intrinsisch unordentlich.

Ich sage, es ist eine gute Praxis, aber nicht eine, der ich folge.

Tests im Allgemeinen sicherstellen, dass ich mache, was ich vorhabe, und es ist zu cluttery für meine Ästhetik.

+1

Dies fasst genau zusammen, wie ich darüber fühle. Ich verwende nur Finale in meinen statischen Strings. Da Java die Objekte nach Wert übergibt (im Gegensatz zu C), ist die Verwendung von final in da auch nur ein Krempel. Am Ende weißt du entweder was du tust oder nicht. Ich hatte NIEMALS einen Fehler, der durch den Einsatz von Endspielen hätte verhindert werden können ... Niemals! – Lawrence

3

Ja, das ist eine sehr gute Idee, denn es zeigt deutlich, welche Felder bei der Objektkonstruktion bereitgestellt werden müssen.

Ich stimme absolut nicht zu, dass es "Code Clutter" erstellt; Es ist ein guter und kraftvoller Aspekt der Sprache.

Als Entwurfsprinzip sollten Sie Ihre Klassen immutable (alle letzten Felder) machen, wenn Sie können, weil sie sicher veröffentlicht werden können (dh frei herumgereicht werden, ohne Angst, dass sie beschädigt werden). Beachten Sie, dass die Felder selbst auch unveränderliche Objekte sein müssen.

0

Ich würde ja sagen, nicht so sehr für die Compiler-Optimierung, sondern eher für die Lesbarkeit.

Aber ich persönlich benutze es nicht. Java ist von sich aus ziemlich ausführlich, und wenn wir alles befolgten, was als "gute Praxis" betrachtet wurde, wäre der Code nicht von allen Vorsätzen entfernbar. Es ist jedoch eine Frage der Präferenz.

7

ich routinemäßig final auf lokale Variablen in meinem Code anwenden und zusätzlich Lesen Code viel einfacher finden, nachdem zuerst alle mit dem final Stichwort effictively final Variablen markiert haben. Ich betrachte dies als eine echte Verbesserung des Codes und begehe es direkt danach.

Was das Problem der Code-Clutter betrifft, finde ich es bei Anwendung auf lokale Variablen nicht schädlich — in der Tat macht es mich alle Deklarationen leichter zu erkennen aufgrund der Syntax Färbung.

Ich muss allerdings zugeben, dass ich es unerträglich cluttery finden tun, wenn final auf Parameter, catch-Blöcke verwendet wird, enhanced-for-Schleifen und allen anderen Orten außer den lokalen Variablen im engeren Sinne. Dies ist sehr bedauerlich, da eine Neuzuweisung in diesen Fällen noch verwirrender ist und sie eigentlich endgültig sein sollten.