2016-08-03 27 views
2

Für eine Singleton Klasse, ist es eine gute Idee, String-Konstanten zu halten (intern in den Mitgliedsfunktionen verwendet) als private static final oder private final?private static final String oder private final String

Ich möchte mehr in Bezug auf Unterschiede in der Klasse Speicherabdruck für eine lange laufende Anwendung und sonst wissen.

Hinweis: Ich weiß, wie static und final eine Variable beeinflussen. Meine Frage ist spezifisch für Konstanten, die als private für die Klasse verwendet werden. Genauer gesagt - über ihre Lebenszeit. Auch wenn kein Objekt dieser Klasse in Erinnerung ist.

+1

Vorher überprüfen, ist es gut, Singleton zu verwenden?Die Verwendung von DI ist viel sauberer, es sei denn, es ist ein Dienstprogramm wie Logger. – ganesshkumar

+0

Die Klasse wird ausschließlich erstellt, um Daten aus einer Datei im Speicher zu importieren (der Import erfolgt nur einmal), und die Zeichenfolgenkonstanten sind JSON-Tags. Es ist also nicht Singleton, aber sein Objekt wird nur einmal (beim Import) erstellt. Daher werden diese String-Konstanten nach dem Import nie wieder verwendet. –

+0

Mögliches Duplikat von [Was bewirkt das 'statische' Schlüsselwort in einer Klasse?] (Http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) – Raedwald

Antwort

2

String-Konstanten leben normalerweise so lange, wie der Code, der sie verwendet, am Leben ist. Während in der Theorie String-Konstanten, die nicht durch Variablen bezeichnet werden, bei ihrer nächsten Verwendung freigegeben und neu erstellt werden können, geschieht dies bei aktuellen JVMs nicht.

Noch gibt es einen kleinen Overhead in Bezug auf die Felder mit den Referenzen, nicht nur die Größe einer Objektreferenz, sondern auch die zugehörigen Metadaten, die Sie vermeiden könnten. Legen Sie einfach die Konstanten in einer speziellen Halter Klasse:

public class Singleton { 
    private static final class Constants { 
     static final String CONSTANT_1 = "Foo"; 
     static final String CONSTANT_2 = "Bar"; 
     static final String CONSTANT_3 = "Baz"; 
     static final String CONSTANT_4 = "etc"; 

     private Constants() { throw new AssertionError(); } 
    } 

    // … 

    // Use the constants either via Constants.CONSTANT_1, etc. 
    // or using import static Singleton.Constants.*; and 
    // unqualified names ala CONSTANT_1, CONSTANT_2, etc. 

    // … 
} 

Diese Klasse muss nicht eine verschachtelte Klasse sein, aber Constants als geschachtelte Klasse entworfen private zu Singleton wie vorgesehen sein. Da wir über Konstanten sprechen, impliziert ihre Verwendung keinen Feldzugriff, stattdessen wird der konstante Wert verwendet. Mit anderen Worten, da die verschachtelte Klasse Constants niemals zur Laufzeit tatsächlich verwendet wird, wird sie nie geladen, daher belegen die Felder keinen Speicher, weder im Heap noch im Metaspace.

Also, was übrig bleibt, bezieht sich der Code tatsächlich auf die konstanten Werte. Wie gesagt, gibt es sogar die theoretische Möglichkeit, die String-Instanzen zu sammeln, wenn der Code längere Zeit nicht läuft (solange sich kein anderer Code oder Variablen auf dieselbe Konstante beziehen), aber diese Möglichkeit wird nicht von der aktuellen verwendet JVMs. Das Sammeln der String-Instanz, während der Code erreichbar ist, würde auch bedeuten, dass der ursprüngliche Inhalt, z. in der Klassendateiform, immer noch zur Hand.


Es sollte betont werden, dass die Code auf die Konstanten unter Bezugnahme identisch sein wird, unabhängig davon, ob die Konstanten sind final Variablen, wie static oder Instanzfelder in Singleton, static Felder in einem anderen Halter Klasse oder sogar lokale Variablen. Diese Varianten unterscheiden sich nur darin, ob und welche Art von zusätzlichen Variablen existieren, die sich auf dieselben Konstanten beziehen.

1

Es gibt nicht viel Unterschied zwischen diesen, nur dass die private static final String initialisiert wird, wenn das Programm initialisiert wird, wird die private final String initialisiert, wenn die Singletons-Instanz erstellt wird.

Der einzige Vorteil des static String ist, ist, dass man es in statischen Methoden verwenden (wenn Sie sie benötigen)

auch keine Performance-Probleme mit beiden von ihnen gibt es, da beide Variablen nicht get Müll gesammelt solange das Programm läuft.