Hat ein final String in einem privaten statischen Methode instantiate ein neues Objekt, wenn sie aufgerufen?

StackOverflow https://stackoverflow.com/questions/3947311

  •  08-10-2019
  •  | 
  •  

Frage

Gibt es ein statisches final String in einer privaten statischen Methode instantiate ein neues Objekt beim Aufruf?

private static String Test() {
    final String foo = "string literal";
    return foo;
}

Oder ist der Compiler weiß, gibt es nur einen einzigen, Stringliteral, innerhalb der Methode? Oder soll ich es aber auch ein privates static final Klassenfeld? Dies hat den Effekt der besseren Lesbarkeit zu reduzieren, indem Sie den Code um die Klasse zu verbreiten.

War es hilfreich?

Lösung

Nein, die bestimmte Zeichenfolge wird von der Stringliteral Pool wiederverwendet werden. Wenn es zum Beispiel ist:

final String foo = new String("string literal");

Dann in der Tat ein neues wird erstellt, jedes Mal wird die Methode aufgerufen wird.

Hier ist ein Beweis:

public static void main(String[] args) throws Exception {
    String s1 = test1();
    String s2 = test1();
    System.out.println(s1 == s2); // true

    String s3 = test2();
    String s4 = test2();
    System.out.println(s3 == s4); // false
}

private static String test1() {
    final String foo = "string literal";
    return foo;
}

private static String test2() {
    final String foo = new String("string literal");
    return foo;
}

Beachten Sie, dass der final Modifier keinen Einfluss in diesem speziellen Fall. Es verbietet nur die Variable aus neu zugewiesen werden.

Andere Tipps

Sie müssen nicht zu viel über Stringliterale kümmern. Stringliterale werden spezielle Behandlung durch die JVM gegebene Leistung zu erhöhen und Speicher-Overhead zu verringern. Ein Stringliteral gebrauchtes überall in Ihrem Code (lokal oder auf andere Weise) wird gesammelt und durch die JVM wiederverwendet werden. Dies erfolgt über die Anzahl der String zu reduzieren Objekte in der JVM erstellt. Jedes Mal, wenn Ihr Code erstellt eine Stringliteral, die JVM prüft den Stringliteral im Pool zuerst. Wenn die Zeichenfolge bereits im Pool vorhanden ist, wird ein Verweis auf die gepoolten Instanz zurückgegeben. Wenn die Zeichenfolge nicht im Pool vorhanden ist, ein neues String-Objekt instanziiert, dann in dem Pool platziert wird. Java kann diese Optimierung machen, da Strings unveränderlich ist und ohne Angst vor Datenkorruption geteilt werden. Allerdings ist dieses Verhalten gilt für Stringliterale nur und nicht mit dem „neuen“ Schlüsselwort erstellten Objekte.

Insgesamt macht eine Stringliteral einer Klassenvariablen (private static final class Feld) oder als lokale Variable zu halten hat die gleiche Wirkung.

Nur eine Instanz eines String für eine Stringliteral erstellt. Diese sind in der „intern Pool“ der String Klasse gespeichert. Also, diese String Initialisierungen gegeben:

String copy = new String("x");
String alias = copy.intern();

Die Aussagen copy != "x" und alias == "x" beide wahr sind.

In diesem Fall wäre es viel besser lesbar sein, wenn Sie nur ein Feld haben.

foo wird jedes Mal instanziiert werden Ihre Funktion aufgerufen wird, weil es sich um eine lokale Variable in einer Methode ist. Die Tatsache, dass diese spezielle Methode statisch ist, ist irrelevant. foo auch endgültig sein hat keine Wirkung, wenn es instanziiert wird, es bedeutet nur, dass foo nicht nach der ersten Zuordnung ändern können.

Machen Sie es eine private statische Klassenvariablen, um sicherzustellen, es nur einmal instanziiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top