對於單例類,將字符串常量(在成員函數內部使用)保持爲private static final
或private final
是一個好主意嗎?private static final String or private final String
我想知道更多關於長時間運行的應用程序和其他類的內存佔用差異。
注:我知道static
和final
如何影響一個變量。我的問題是針對用於private
的常量。更具體地說 - 關於那裏的一生。即使當班裏沒有任何對象存在於記憶中。
對於單例類,將字符串常量(在成員函數內部使用)保持爲private static final
或private final
是一個好主意嗎?private static final String or private final String
我想知道更多關於長時間運行的應用程序和其他類的內存佔用差異。
注:我知道static
和final
如何影響一個變量。我的問題是針對用於private
的常量。更具體地說 - 關於那裏的一生。即使當班裏沒有任何對象存在於記憶中。
只要使用它的代碼仍然存在,字符串常量就會存活。理論上講,變量引用的字符串常量可以在下次使用時釋放並重新創建,但這對目前的JVM不會發生。
儘管如此,字段仍然存在一個很小的開銷,它不僅包含對象引用的大小,還包含關聯的元數據,您可以避免這些引用。只需將這些常量在一個專用的支架類:
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.
// …
}
那類並不需要是一個嵌套類,但Constants
設計爲嵌套類是private
到Singleton
如預期。由於我們在談論常量,它們的使用並不意味着字段訪問,而是使用常數值。換句話說,因爲嵌套類Constants
在運行時永遠不會被實際使用,所以它永遠不會被加載,因此這些字段不會佔用內存,無論是在堆中還是在元空間中。
所以剩下的是代碼實際上指的是常量值。如上所述,如果代碼長時間不運行(只要沒有其他代碼或變量引用相同的常量),則甚至有收集字符串實例的理論可能性,但是這種可能性不被當前使用JVM中。在代碼可到達時收集String實例也意味着必須具有原始內容,例如,以檔案形式,仍在手邊。
應當強調的是,代碼指常量將是相同的,不管常數是否final
變量,如在Singleton
static
或實例字段,在另一座級static
領域,甚至局部變量。這些變體僅在不同的附加變量或附加變量存在時有所不同,指的是相同的常量。
這些之間沒有太大的區別,只有private static final String
在程序初始化時被初始化,private final String
在創建單例實例時被初始化。
的static
字符串是唯一的好處,就是可以在靜態方法也使用它(如果需要的話)
還沒有性能問題與他們兩個,因爲這兩個變量將不會只要程序正在運行,就得到垃圾回收。
在此之前,檢查使用Singleton是否好?使用DI是更簡潔的方式,除非它是Logger等實用程序。 – ganesshkumar
該類僅用於從內存中的文件導入數據(導入只發生一次),而字符串常量是json標記。所以它不是每個單身人士,但它的對象只創建一次(在導入過程中)。因此,這些字符串常量在導入完成後不再使用。 –
[可能是'static'關鍵字在類中做了什麼?](http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) – Raedwald