2016-08-03 58 views
2

對於單例類,將字符串常量(在成員函數內部使用)保持爲private static finalprivate final是一個好主意嗎?private static final String or private final String

我想知道更多關於長時間運行的應用程序和其他類的內存佔用差異。

注:我知道staticfinal如何影響一個變量。我的問題是針對用於private的常量。更具體地說 - 關於那裏的一生。即使當班裏沒有任何對象存在於記憶中。

+1

在此之前,檢查使用Singleton是否好?使用DI是更簡潔的方式,除非它是Logger等實用程序。 – ganesshkumar

+0

該類僅用於從內存中的文件導入數據(導入只發生一次),而字符串常量是json標記。所以它不是每個單身人士,但它的對象只創建一次(在導入過程中)。因此,這些字符串常量在導入完成後不再使用。 –

+0

[可能是'static'關鍵字在類中做了什麼?](http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) – Raedwald

回答

2

只要使用它的代碼仍然存在,字符串常量就會存活。理論上講,變量引用的字符串常量可以在下次使用時釋放並重新創建,但這對目前的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設計爲嵌套類是privateSingleton如預期。由於我們在談論常量,它們的使用並不意味着字段訪問,而是使用常數值。換句話說,因爲嵌套類Constants在運行時永遠不會被實際使用,所以它永遠不會被加載,因此這些字段不會佔用內存,無論是在堆中還是在元空間中。

所以剩下的是代碼實際上指的是常量值。如上所述,如果代碼長時間不運行(只要沒有其他代碼或變量引用相同的常量),則甚至有收集字符串實例的理論可能性,但是這種可能性不被當前使用JVM中。在代碼可到達時收集String實例也意味着必須具有原始內容,例如,以檔案形式,仍在手邊。


應當強調的是,代碼指常量將是相同的,不管常數是否final變量,如在Singletonstatic或實例字段,在另一座級static領域,甚至局部變量。這些變體僅在不同的附加變量或附加變量存在時有所不同,指的是相同的常量。

1

這些之間沒有太大的區別,只有private static final String在程序初始化時被初始化,private final String在創建單例實例時被初始化。

static字符串是唯一的好處,就是可以在靜態方法也使用它(如果需要的話)

還沒有性能問題與他們兩個,因爲這兩個變量將不會只要程序正在運行,就得到垃圾回收