Warum einen String (als endgültig) deklarieren und dann verwenden?

8

Welchen Unterschied macht es in einer typischen Spring-MVC-Validator-Klasse beim Einfügen eines errorCode-Werts in das Errors-Objekt zwischen der Verwendung eines solchen String ( props.somefield.req)

errors.rejectValue("elementId", "props.somefield.req");

Verse einer deklarierten statischen endgültigen Zeichenfolge?

private static final String SOMFIELD_REQ = "props.somefield.req"; ...
errors.rejectValue("elementId", SOMFIELD_REQ);

Verbessert es die Leistung auch nur im geringsten? Ich habe ein paar Fragen zum Stapelüberlauf gelesen ( String und final , Ist es sinnvoll, einen finalen String in Java zu definieren? ), Aber niemand hat die Frage zur Aktualisierung dieser Fragen beantwortet.

happybuddha
quelle
2
Meta-Bit: Der Grund, warum niemand darauf geantwortet hat, war, dass Erweiterungen bestehender Fragen wirklich keine guten Fragen sind. Dinge wie "Aktualisieren" und "Bearbeiten" sind Anzeichen einer schleichenden Frage (was ist, wenn die schleichende Frage ein Dup ist oder wenn jemand das Update beantwortet, aber nicht das Original? Oder das Original, aber nicht das Update? - Anschlussfragen in neuen Fragen ist die beste Politik)
Jede schreibgeschützte Zeichenfolge, die mehrmals verwendet wird, kann sicher in ein statisches Endfeld eingefügt werden, um Fehler bei der Eingabe zu vermeiden oder um eine Umgestaltung zu ermöglichen. Für Literale, die nur einmal verwendet werden, denke ich, dass es nicht wirklich wichtig ist.
Trilarion

Antworten:

21

Zur Laufzeit macht es keinen Unterschied.

Der Punkt ist die Lesbarkeit - als Mitgliedsvariable wird sie wahrscheinlich am Anfang des Quellcodes der Klasse deklariert. Wenn sie statisch ist, muss sie nicht für jede neue Instanz der Klasse zugewiesen werden.

Wenn Sie es endgültig machen, bedeutet dies für den Leser, dass sich der Wert nicht ändert (auch für den Compiler, aber das ist hier weniger wichtig).

Auf diese Weise sind keine "magischen Werte" in der Implementierung vergraben, und wenn eine Änderung der "Konstante" gewünscht wird, muss sie nur an einer Stelle geändert werden.

Dies ahmt im Grunde nach, was ein C-Programmierer mit einem #define machen würde.

GreyBeardedGeek
quelle
2
+1 Der Leistungsgewinn ist irrelevant, es geht um Lesbarkeit, Wartbarkeit und Absicht.
Bitte
5

final Felder haben viele Vorteile!

Das Deklarieren von Feldern finalbietet wertvolle Dokumentationsvorteile für Entwickler, die Ihre Klasse verwenden oder erweitern möchten. Dies erklärt nicht nur die Funktionsweise der Klasse, sondern hilft auch dem Compiler bei der Durchsetzung Ihrer Entwurfsentscheidungen. Anders als bei finalMethoden hilft das Deklarieren eines endgültigen Felds dem Optimierer, bessere Optimierungsentscheidungen zu treffen . Wenn der Compiler weiß, dass sich der Wert des Felds nicht ändert, kann er den Wert sicher in einem Register zwischenspeichern . finalFelder bieten außerdem ein zusätzliches Maß an Sicherheit, indem der Compiler erzwingt, dass ein Feld schreibgeschützt ist.

Versuchen Sie nicht, es finalals Performance-Management-Tool zu verwenden. Es gibt viel bessere und weniger einschränkende Möglichkeiten, um die Leistung Ihres Programms zu verbessern. Verwenden finalSie diese Option, wenn sie die grundlegende Semantik Ihres Programms widerspiegelt: um anzuzeigen, dass Klassen unveränderlich oder schreibgeschützt sein sollen.

Bevor Sie endgültige Felder deklarieren, sollten Sie sich fragen: Muss dieses Feld wirklich veränderbar sein?

Anton Dozortsev
quelle