zoukankan      html  css  js  c++  java
  • 静态变量的陷阱

    我们都知道,静态变量用起来是挺方便的,可是一不小心那就say拜拜了。说一说我在项目中遇到的情况,测试了好多次,最后才发现原因。感动啊!

    private static String UserRootPath = "/sdcard/User/"+UserManager.username;

    private static String UserCache=UserRootPath+"/path";

    目的:

    在一个类中,定义了上面两个静态变量,想要实现不同用户登录创建不同的文件夹,UserManager.username为用户名。

    然后就掉进坑了。

    情况是这样的:

    当我登录一个账号A,确实创建了对应文件夹A,但是注销登录,用另一个账号B再次登陆的时候,却不会再创建文件夹了B。Why,捣鼓了好久,在测试过程中发现登录B后,UserManager确实变为B了,可是UserRootPath却还是原来的那个"/sdcard/User/"+A。

    对于静态变量的陷阱我早有耳闻,所以立马反应过来时静态变量出了问题。

    原来在关闭activity或者应用之后UserRootPath占用的内存还在,所以再次登录的时候UserRootPath还是原来的值,不会改变,即使这个时候UserManager.username已经发生了改变(创建文件夹的时候在代码中判断该文件夹是否已经存在,因为路径没变,所以判断出来的结果是已经存在,所以就不会再创建了)。事实证明,如果关闭应用后强制kill掉该应用的进程,那么再次登录就不会出现这种情况。

    于是我在登陆之后重新给UserRootPath赋值一次

    本来以为解决了,却发现B的子目录没有创建(+_+)。

    原来子目录UserCache引用了UserRootPath,类似于上面的情况,由于UserCache也是静态变量,虽然再次登陆之后UserRootPath改变了,但是UserCache还是之前那个(由于没有重新赋值,所以它里面的UserRootPath还是之前那个没有变)

    于是我在登陆之后也给UserCache重新赋值一次

     说到最后就是想说以后用静态变量的时候记得更新变量的值,尤其是静态变量引用了另一个变量的时候,仅仅改变那个被引用的变量是不行的,还要把静态变量的值也更新了。(因为静态变量什么时候被回收具有不确定性)。

  • 相关阅读:
    .net(关于字符串的相等问题[比较重要])
    .net(基本数据类型,枚举类型,枚举字符串的相互转化)
    如何安全的读入一个整数或者浮点数
    .net(数组)
    什么是EAI?
    PowerShell 入门
    sql server 2005 如何删除前几条记录或重复记录
    如何查看客户端的IP地址,机器名,MAC地址,登陆名等信息
    sql server 2005 几个常用的存储过程或函数
    ASP.NET 母版页的加载顺序
  • 原文地址:https://www.cnblogs.com/tangZH/p/6181722.html
Copyright © 2011-2022 走看看