2015-10-26 69 views
3

我有一個靜態工廠方法,它將返回一個片段對象。什麼時候靜態變量得到垃圾回收?

private static String final A1="a1"; 
private static String final A2="a2"; 
private static String final A3="a2"; 
private static String final A4="a4"; 

public static MyFragment newInstance(int index) { 
    MyFragment f = new MyFragment(); 
    Bundle args = new Bundle(4); 
    args.putInt(A1, index); 
    args.putInt(A2, index); 
    args.putInt(A3, index); 
    args.putInt(A4, index); 
    f.setArguments(args); 
    return f; 
} 

和我得到它的內oncreate()

getArguments().getInt(A1, 0); 

現在我的問題是:我創建了幾個MyFragment物體的像下面

List<Fragment> fragments = new ArrayList<>(); 
fragments.add(MyFragment.newInstance(defaultId)); 
int i = 1; 
for (Categories categories : mCategories) { 
    String id = categories.getCategory_id(); 
    String name = categories.getCategory_name(); 
    // String slno = categories.getSlno(); 
    fragments.add(MyFragment.newInstance(defaultId)); 
    Titles[i] = name; 
    i++; 
} 

由於變量A1-A4爲靜態的意志它清楚它的活動摧毀的記憶?或者我需要在onDistroy中將變量分配爲null

請幫我澄清一下疑問嗎?

+1

你有太多標記爲最終。所以你不能對它們有任何新的價值。別擔心。 'final static'是java常量的標記。在java中,儘量少用一些練習來尋找static和final的含義。 – Blackbelt

回答

2

一個靜態變量在類被加載時被分配,並且只有在加載該類的類加載器本身被釋放時纔會被垃圾回收。當且僅當其定義類裝載程序 可以通過垃圾收集器回收[...]由引導加載器加載類和 接口,可能無法被卸載

類或接口可以被卸載。

查看回答類似的問題Are static fields open for garbage collection?

+0

所以,在onDistroy()中初始化它爲null是正確的做法嗎?所以垃圾收集器可以儘快釋放內存.. – Christ

+1

@基準不,這些是最終的,因此不能分配給'null'。在Java中很少有人會擔心清理對基元(或字符串)的引用,因爲它們被VM和GC區別對待。如果你確實想卸載onDestroy中的某些東西,使它們成爲一個非靜態變量,並且它們將與類一起收集,但是這個例子並不是你希望這樣做的情況,因爲優化器可能內聯了當前的實現。 – LINEMAN78