2015-10-26 63 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