Wann genau sollen wir “public static final String” verwenden?
Lesezeit: 8 Minuten
Sturmbrecher
Ich habe viel Code gesehen, wo Leute schreiben public static final String mystring = ...
und dann einfach einen Wert verwenden.
Warum müssen sie das tun? Warum müssen sie den Wert als initialisieren final vor der Verwendung?
AKTUALISIEREN
Ok, vielen Dank für all Ihre Antworten, ich verstehe die Bedeutung dieser Schlüssel (öffentliches statisches Finale). Was ich nicht verstehe, ist, warum die Leute das verwenden, auch wenn die Konstante nur an einem Ort und nur in derselben Klasse verwendet wird. warum deklarieren? Warum verwenden wir nicht einfach die Variable?
beim Definieren von String als Konstante ..
– harsch
26. Juli 2012 um 20:41 Uhr
In Bezug auf das Update ist es nur eine gute Praxis (IMO). Wenn Sie später zurückkehren und denselben Wert erneut verwenden müssen, müssen Sie ihn nicht definieren und den vorherigen Code aktualisieren.
– Mavelo
31. Dezember 2014 um 13:11 Uhr
Das hat sicher seine Vorteile. Aber Code wie public static final String TILDE_EQUAL = "~="; regt mich echt auf. Wann kann “tilde-gleich” etwas anderes sein als ~=?
– kgf3JfUtW
29. August 2017 um 20:32 Uhr
@kgf3JfUtW – jede allgemein gute Richtlinie kann von Leuten missbraucht werden, die die Begründung nicht verstehen oder die Regeln blind befolgen, weil jemand sie mit dem Zauberspruch “es ist eine bewährte Methode” verflucht hat.
– Benutzer16632363
3. Oktober 2021 um 15:16 Uhr
@kgf3JfUtW Angesichts der Tatsache, wie die JVM String-Literale verkettet und optimiert, bin ich mir nicht sicher, ob es notwendig ist, eine String-Konstante anstelle eines Literals zu verwenden. Das heißt, etwas wie BigInteger BIG_ONE = new BigInteger(1); ist nicht unbedingt schlechte Praxis. Es ist in Java für Strings nicht notwendig, da die Sprache spezielle Unterstützung für sie bietet, aber wenn jeder “~=”-Aufruf ein separates String-Objekt erstellt und Sie dies in einer Reihe von Schleifen tun, könnte TILDE_EQUAL gerechtfertigt sein. Kurz gesagt, Konstanten können gültige Verwendungen haben, selbst wenn der Bezeichner den Wert offensichtlich macht.
– Trixie Wolf
14. Dezember 2021 um 0:48 Uhr
pb2q
final gibt an, dass sich der Wert der Variablen nicht ändert – mit anderen Worten, a Konstante dessen Wert nicht geändert werden kann, nachdem er deklariert wurde.
Verwenden public final static String wenn Sie eine erstellen möchten String das:
gehört zur Klasse (static: keine Instanz erforderlich, um es zu verwenden), das
wird sich nicht ändern (final), zum Beispiel wenn Sie a definieren möchten String Konstante, die allen Instanzen der Klasse und anderen Objekten, die die Klasse verwenden, zur Verfügung steht, und so weiter
wird ein öffentlich zugänglicher Teil der Schnittstelle sein, die die Klasse der Welt zeigt.
Beispiel:
public final static String MY_CONSTANT = "SomeValue";
// ... in some other code, possibly in another object, use the constant:
if (input.equals(MyClass.MY_CONSTANT)
Ähnlich:
public static final int ERROR_CODE = 127;
Es ist nicht erforderlich benutzen finalverhindert jedoch, dass eine Konstante während der Programmausführung versehentlich geändert wird, und dient als Indikator dafür, dass die Variable eine Konstante ist.
Auch wenn die Konstante nur in der aktuellen Klasse und/oder nur an einer Stelle verwendet – gelesen – wird, ist es eine gute Praxis, alle Konstanten als zu deklarieren final: Es ist klarer, und während der Lebensdauer des Codes kann die Konstante an mehr als einer Stelle verwendet werden.
Weiterhin verwenden final kann es der Implementierung ermöglichen, eine gewisse Optimierung durchzuführen, z. B. indem ein tatsächlicher Wert dort eingefügt wird, wo die Konstante verwendet wird.
Beachte das endlich final wird nur aus primitiven Typen wirklich konstante Werte machen und String was unveränderlich ist. Bewirbt sich final zu einem Objekt (z.B. a HashMap) wird das machen Hinweis unveränderlich, aber nicht der Zustand des Objekts: Beispielsweise können Datenelemente des Objekts geändert werden, Array-Elemente können geändert werden und Sammlungen können manipuliert und geändert werden.
und auch das Static bedeutet, dass auf statische Weise zugegriffen werden kann (dass die Klasse nicht wie new ExampleClass instanziiert werden muss).
– Enrique San Martín
26. Juli 2012 um 20:43 Uhr
Nimmt der Compiler eine Optimierung mit endgültigen statischen Variablen vor? Wie das Ersetzen von Referenzen von endgültigen statischen Variablen durch tatsächliche Werte.
– JProgrammierer
26. Juli 2012 um 20:44 Uhr
Verwenden Sie „public“ nur, wenn es öffentlich sein muss. Bevorzugen Sie “nicht öffentlich”, wenn dies Ihren Anforderungen entspricht.
– Benutzer16632363
3. Oktober 2021 um 15:17 Uhr
@ user16632363 danke für den Kommentar, ich habe meine Antwort bearbeitet, um Ihren Punkt in die Liste in der Antwort aufzunehmen
– pb2q
4. Oktober 2021 um 14:06 Uhr
Danke @TrixieWolf, es ist eine gute Ergänzung zu einer alten Antwort, ich werde das Detail hinzufügen
– pb2q
14. Dezember 2021 um 21:28 Uhr
Statisch bedeutet … Sie können es verwenden, ohne die Klasse zu instanziieren oder ein beliebiges Objekt zu verwenden.
final..Es ist ein Schlüsselwort, das verwendet wird, um den String konstant zu machen. Sie können den Wert dieser Zeichenfolge nicht ändern. Sehen Sie sich das folgende Beispiel an:
public class StringTest {
static final String str = "Hello";
public static void main(String args[]) {
// str = "world"; // gives error
System.out.println(str); // called without the help of an object
System.out.println(StringTest.str);// called with class name
}
}
Vielen Dank
Das Schlüsselwort Finale bedeutet, dass der Wert konstant ist (er kann nicht geändert werden). Es ist analog zu const in C.
Und Sie können behandeln statisch als globale Variable mit Gültigkeitsbereich. Es bedeutet im Grunde, wenn Sie es für ein Objekt ändern, wird es für alle geändert, genau wie eine globale Variable (begrenzt durch den Geltungsbereich).
Ich hoffe es hilft.
Carl
static bedeutet, dass das Objekt nur einmal erstellt wird und kein Instanzobjekt enthält. Die Art und Weise, wie Sie geschrieben haben, wird am besten verwendet, wenn Sie etwas haben, das allen Objekten der Klasse gemeinsam ist und sich nie ändern wird. Es könnte sogar verwendet werden, ohne überhaupt ein Objekt zu erstellen.
Normalerweise ist es am besten, final zu verwenden, wenn Sie es erwarten final damit der Compiler diese Regel erzwingt und Sie es sicher wissen. static stellt sicher, dass Sie keinen Speicher verschwenden, indem Sie viele derselben Dinge erstellen, wenn sie für alle Objekte denselben Wert haben.
final zeigt an, dass der Wert nicht geändert werden kann, sobald er festgelegt wurde. static ermöglicht es Ihnen, den Wert festzulegen, und dieser Wert ist für ALLE Instanzen der Klasse, die ihn verwenden, gleich. Außerdem können Sie auf den Wert von a zugreifen public static Zeichenfolge ohne eine Instanz einer Klasse.
Sie____ nicht müssen, zu … haben verwenden finalaber die final macht allen anderen – einschließlich dem Compiler – klar, dass dies eine Konstante ist, und das ist die gute Praxis darin.
Warum Menschen das tun auch wenn die Konstante nur an einer Stelle und nur in der gleichen Klasse verwendet wird: Weil es in vielen Fällen noch Sinn macht. Wenn Sie zum Beispiel wissen, dass es während des Programmlaufs endgültig sein wird, aber Sie beabsichtigen, den Wert später zu ändern und neu zu kompilieren (einfacher zu finden), und es später möglicherweise öfter verwenden. Es informiert auch andere Programmierer an prominenter und gebündelter Stelle über die zentralen Werte im Programmablauf.
Ein Aspekt, den die anderen Antworten leider vermissen, ist die Verwendung der Kombination von public final muss getan werden sehr vorsichtiginsbesondere wenn andere Klassen oder Pakete Ihre Klasse verwenden werden (was davon ausgegangen werden kann, weil dies der Fall ist public).
Hier ist der Grund:
Weil es als deklariert ist final, fügt der Compiler dieses Feld während der Kompilierzeit in jede Kompilationseinheit ein, die dieses Feld liest. So weit, ist es gut.
Was die Leute gerne vergessen, ist, dass das Feld auch deklariert ist public, fügt der Compiler diesen Wert auch in jede andere Kompiliereinheit ein. Das bedeutet Sonstiges Klassen, die dieses Feld verwenden.
Was sind die Konsequenzen?
Stellen Sie sich vor, Sie haben dies:
class Foo {
public static final String VERSION = "1.0";
}
class Bar {
public static void main(String[] args) {
System.out.println("I am using version " + Foo.VERSION);
}
}
Nach dem Kompilieren und Ausführen BarDu wirst kriegen:
I am using version 1.0
Jetzt verbesserst du dich Foo und ändern Sie die Version auf “1.1”. Nach dem Neukompilieren FooSie laufen Bar und bekomme diese falsche Ausgabe:
I am using version 1.0
Dies geschieht, weil VERSION ist deklariert finalalso war der tatsächliche Wert bereits eingereiht Bar beim ersten Kompilierungslauf. Als Konsequenz, um das Beispiel von a zu lassen public static final ... -Feld ordnungsgemäß propagieren, nachdem tatsächlich geändert wurde, was deklariert wurde final (du hast gelogen!;), müsstest du kompilieren Sie jede Klasse neu, die es verwendet.
Ich habe das ein paar Mal gesehen und es ist wirklich schwer zu debuggen.
Wenn durch final du meinst ein konstantes that könnte in späteren Versionen Ihres Programms ändern, wäre eine bessere Lösung diese:
class Foo {
private static String version = "1.0";
public static final String getVersion() {
return version;
}
}
Die Leistungseinbußen sind vernachlässigbar, da der JIT-Code-Generator ihn zur Laufzeit einbettet.
devang
Normalerweise zum Definieren von Konstanten, die Sie an vielen Stellen wiederverwenden, um sie an einem einzigen Punkt für Änderungen zu verwenden, die innerhalb einer einzelnen Klasse verwendet oder von Paketen gemeinsam genutzt werden. Vermeiden Sie versehentliche Änderungen, indem Sie ein variables Finale erstellen.
10553900cookie-checkWann genau sollen wir “public static final String” verwenden?yes
beim Definieren von String als Konstante ..
– harsch
26. Juli 2012 um 20:41 Uhr
In Bezug auf das Update ist es nur eine gute Praxis (IMO). Wenn Sie später zurückkehren und denselben Wert erneut verwenden müssen, müssen Sie ihn nicht definieren und den vorherigen Code aktualisieren.
– Mavelo
31. Dezember 2014 um 13:11 Uhr
Das hat sicher seine Vorteile. Aber Code wie
public static final String TILDE_EQUAL = "~=";
regt mich echt auf. Wann kann “tilde-gleich” etwas anderes sein als~=
?– kgf3JfUtW
29. August 2017 um 20:32 Uhr
@kgf3JfUtW – jede allgemein gute Richtlinie kann von Leuten missbraucht werden, die die Begründung nicht verstehen oder die Regeln blind befolgen, weil jemand sie mit dem Zauberspruch “es ist eine bewährte Methode” verflucht hat.
– Benutzer16632363
3. Oktober 2021 um 15:16 Uhr
@kgf3JfUtW Angesichts der Tatsache, wie die JVM String-Literale verkettet und optimiert, bin ich mir nicht sicher, ob es notwendig ist, eine String-Konstante anstelle eines Literals zu verwenden. Das heißt, etwas wie BigInteger BIG_ONE = new BigInteger(1); ist nicht unbedingt schlechte Praxis. Es ist in Java für Strings nicht notwendig, da die Sprache spezielle Unterstützung für sie bietet, aber wenn jeder “~=”-Aufruf ein separates String-Objekt erstellt und Sie dies in einer Reihe von Schleifen tun, könnte TILDE_EQUAL gerechtfertigt sein. Kurz gesagt, Konstanten können gültige Verwendungen haben, selbst wenn der Bezeichner den Wert offensichtlich macht.
– Trixie Wolf
14. Dezember 2021 um 0:48 Uhr