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.
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
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. –
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