Seit ich vor final
ein paar Jahren die Möglichkeiten des Schlüsselworts in Java entdeckt habe, konnte ich meine Codes viel besser lesen, da die Benutzer leicht erkennen können, was schreibgeschützte Variablen sind. Es kann auch die JIT ein wenig ankurbeln, und obwohl es sich um eine sehr eingeschränkte handelt, kann es nicht schaden, insbesondere wenn es auf eingebettete Geräte wie Android-Plattformen abzielt.
Vor allem aber trägt es dazu bei, ein Design widerstandsfähiger gegen Änderungen zu machen und andere Committer bei der Änderung der Codebasis zu unterstützen.
Beim Durchsuchen eines Teils des JDK-Quellcodes bin ich jedoch nie auf dieses Schlüsselwort gestoßen, weder für Klassen, Methoden noch für Variablen. Gleiches gilt für verschiedene Systeme, die ich überprüfen musste.
Gibt es einen Grund? Ist es ein gängiges Design-Paradigma, alles von innen wandelbar zu lassen?
final
Feldern hat die gleiche Semantik wie einvolatile
Schreibfeld, und dann muss das Lesen später flüchtige Lese Semantik haben, das ist nicht immer das, was Sie wollenAntworten:
Ich vermute, der Grund, warum Sie es nicht sehen, ist, dass das JDK für die Erweiterung ausgelegt ist (es ist die Basis, auf der alle Ihre Programme aufbauen). Es ist nicht ungewöhnlich, dass Anwendungscode davon Gebrauch macht. Ich würde auch nicht erwarten, viel davon im Bibliothekscode zu sehen (da Bibliotheken oft auch für Erweiterungen ausgelegt sind).
Werfen Sie einen Blick auf einige gute Open Source-Projekte und ich denke, Sie werden mehr finden.
Im Gegensatz zu dem, was Sie in Java in der .NET-Welt sehen, habe ich oft das Argument gehört, dass Klassen standardmäßig
sealed
(ähnlich wie final auf eine Klasse angewendet) sein sollten und dass der Entwickler die Versiegelung explizit aufheben sollte es.quelle
final
Feldern und nicht von Methoden. Unveränderliche Klassen können auch erweitert werden.Das Problem bei der Verwendung ,
final
dass etwas zu vermitteln , ist schreibgeschützt ist , dass es wirklich nur für primitive Typen funktioniert wieint
,char
etc. Alles in Java - Objekten werden mit einem (Art) Zeiger tatsächlich bezeichnet. Wenn Sie dasfinal
Schlüsselwort für ein Objekt verwenden, wird daher nur gesagt, dass die Referenz schreibgeschützt ist und das Objekt selbst noch veränderbar ist.Es könnte mehr verwendet worden sein, wenn das Objekt tatsächlich schreibgeschützt wäre. In C ++ ist das genau das, was es
const
tut, und als Ergebnis ist es ein viel nützlicheres und am häufigsten verwendetes Schlüsselwort.Ein Bereich, in dem ich das
final
Schlüsselwort häufig verwende, sind Parameter, um Verwirrungen zu vermeiden, die durch Folgendes verursacht werden:In diesem Beispiel scheint es offensichtlich, warum dies nicht funktioniert, aber wenn
someMethod(FancyObject)
es groß und kompliziert ist, kann es zu Verwirrung kommen. Warum vermeiden wir es nicht?Es ist auch Teil der Sun- (oder Oracle-) Codierungsstandards.
quelle
final
die Java-API-Klassen häufiger verwendet wurden , waren die meisten Objekte wie bei vielen Scala-Bibliotheken unveränderlich. Wenn Sie dann Objektfelder erstellen,final
wird die Klasse in vielen Fällen unveränderlich. Dieses Design wird bereits inBigDecimal
und verwendetString
.Ich stimme zu, dass das
final
Keyword die Lesbarkeit verbessert. Es macht es viel einfacher zu verstehen, wann ein Objekt unveränderlich ist. In Java ist es jedoch äußerst ausführlich, insbesondere (meiner Meinung nach), wenn es für Parameter verwendet wird. Das soll nicht heißen, dass die Leute es nicht benutzen sollten, weil es ausführlich ist, sondern sie benutzen es nicht, weil es ausführlich ist.Eine andere Sprache, wie Scala, macht es viel einfacher, endgültige Erklärungen abzugeben ( val ). In diesen Sprachen können Abschlussdeklarationen häufiger vorkommen als Variablen.
Beachten Sie, dass das Schlüsselwort final auf viele verschiedene Arten verwendet werden kann. Ihr Beitrag deckt hauptsächlich die Punkte 2 und 3 ab.
quelle
Zunächst einmal befürworten oder verbieten offizielle Java- Code-Konventionen keine bestimmte Verwendung von
final
. Das heißt, JDK-Entwickler können frei wählen, wie sie es bevorzugen.Ich kann ihre Gedanken nicht lesen, aber für mich war
final
es eine Frage des Fokus, ob man sie benutzt oder nicht. Eine Frage, ob ich genug Zeit habe, um mich gründlich auf den Code zu konzentrieren oder nicht .final
als Müll wahrgenommen, der nur Dinge verdeckt, die im Code bereits deutlich genug zum Ausdruck gebracht werden. Offenbar fallen JDK-Entwickler auch in diese Kategorie.Auf der anderen Seite war es bei einem anderen Projekt völlig anders, bei dem wir durchschnittlich eine Stunde mit 100 Codezeilen verbracht haben. Dort schoss ich
final
wie eine Maschinenpistole in meinem eigenen Code und im Code eines anderen - einfach, weil es der schnellste Weg war, eine Absicht des Mannes zu erkennen, der sie vor mir schrieb, und ebenso der schnellste Weg, meine eigene Absicht mitzuteilen der Typ, der später an meinem Code arbeiten wird.Argumentation wie oben ist rutschig. Vorzeitige Optimierung kann schaden; Donald Knuth geht so weit, es "die Wurzel allen Übels" zu nennen . Lass dich nicht fangen. Schreibe dummen Code .
quelle
Kürzlich entdeckte ich die Freude an der Funktion "Aktionen speichern" in Eclipse IDE. Ich kann ihn zwingen, meinen Code neu zu formatieren, fehlende
@Override
Anmerkungen einzufügen und einige raffinierte Dinge zu tun, z. B. unnötige Klammern in Ausdrücken zu entfernen oder dasfinal
Schlüsselwort bei jedem Treffer automatisch überallhin zu setzenctrl + S
. Ich habe einige dieser Auslöser aktiviert und, Junge, es hilft sehr!Es stellte sich heraus, dass viele dieser Auslöser wie eine schnelle Überprüfung der Integrität meines Codes wirken.
ctrl + s
? - Vielleicht habe ich irgendwo Parametertypen vermasselt!final
. Ist es hat , um seinen Wert zu ändern?Es stellte sich heraus, dass je weniger Variablen sich ändern, desto weniger Probleme habe ich beim Debuggen. Wie oft haben Sie den Wert einer Variablen verfolgt, nur um festzustellen, dass er sich irgendwie von etwa 5 auf 7 ändert? "Wie zum Teufel könnte es sein ?!" Du fragst dich und verbringst die nächsten paar Stunden damit, unzählige Methoden ein- und auszuschalten, um herauszufinden, dass du einen Fehler in deiner Logik gemacht hast. Und um das Problem zu beheben, müssen Sie ein weiteres Flag und einige Bedingungen hinzufügen und hier und da einige Werte sorgfältig ändern.
Oh, ich hasse das Debuggen! Jedes Mal, wenn ich den Debugger starte, habe ich das Gefühl, dass meine Zeit knapp wird und ich brauche dringend diese Zeit, um zumindest einige meiner Kindheitsträume wahr werden zu lassen! Zum Teufel mit dem Debuggen!
final
s bedeutet keine mysteriösen Wertänderungen mehr. Mehrfinal
s => weniger schwache Teile in meinem Code => weniger Bugs => mehr Zeit für gute Sachen!Was
final
Klassen und Methoden angeht, ist mir das eigentlich egal. Ich liebe Polymorphismus. Polymorphismus bedeutet Wiederverwendung bedeutet weniger Code bedeutet weniger Fehler. JVM leistet ohnehin gute Arbeit mit Devirtualisierung und Methoden-Inlining, daher sehe ich keinen Nutzen darin, Möglichkeiten für die Wiederverwendung von Code zu töten, um unzulängliche Leistungsvorteile zu erzielen.Es
final
ist zunächst etwas ablenkend, all diese s im Code zu sehen, und es braucht Zeit, um sich daran zu gewöhnen. Einige meiner Teamkollegen sind immer noch sehr überrascht, so vielefinal
Keywords zu sehen. Ich wünschte, es gäbe eine Einstellung in der IDE für die spezielle Syntaxfärbung dafür. Ich würde es gerne auf einen Grauton (wie Anmerkungen) ändern, damit sie beim Lesen von Code nicht zu sehr ablenken. Eclipse hat derzeit eine separate Farbe fürreturn
und alle anderen Schlüsselwörter, jedoch nicht fürfinal
.quelle
do
Notation kann man alles machen :) Sicher, Java ist nicht die beste Sprache für das Schreiben in funktionalem Stil, aber es erlaubt Ihnen zumindest, robusten Code zu schreiben - und das ist es, was mir wirklich wichtig ist.