再次进入程序,Java静态变量与成员变量的不同表现和对单例模式的思考
我们知道,在存储方式上,成员变量在JVM中是存储在堆里边的,而静态变量则位于JVM中的方法区,两者的主要区别在于,成员变量不再受引用常常会导致被回收,而方法区对垃圾回收的限制相当严苛,除非是整个应用被卸载,否则静态变量会一直存在。
在android应用中使用成员变量,在退出应用之后,所有的成员变量肯定会被回收,而静态变量则相反。尤其是在UI设计上,如果你自定义一个static的viewgroup,创建时候为其addchlid,你就一定要考虑到这个情况,因为再次进入程序,还是会调用addchild方法,这样肯定会报错,如果child是动态创建的,那么每次viewgroup都会有新的成员填进来,如果child是成员变量什么的,由于此变量一直有个静态引用存在,所以不会被消除,再次添加会报child can only have a parent错误。还有一种情况,如果child也是静态变量,那么静态变量一多,占用的内存开销...尤其是手机上。
综上,在UI设计定义单例模式,感觉不太靠谱,除非是没有子组件的,要不为了避免报child can only have a parent错,要不断地判断孩子有没有父亲,有父亲的话,从父亲里把孩子移除(因为总有个静态的父亲在引用你)。