在进行静态变量操作是一定要小心处理,如果只对静态变量做读操作,可以随便使用,但是如果涉及到静态变量的变更操作,一定要小心加小心,尤其是项目中多处使用静态变量并且有变更操作时。小僧含泪写下此篇,话不多说,我给你念叨下案发现场。
1:首先贴出来项目中使用的静态变量
public class Constant{ public static List<String> cartImportDefaultHeadList = new ArrayList<String>(); static { cartImportDefaultHeadList.add("1"); cartImportDefaultHeadList.add("2"); cartImportDefaultHeadList.add("3"); cartImportDefaultHeadList.add("4"); } } |
2:上面的静态变量分别在方法a和方法b里面使用,方法a根据传过来的标志进行判断是否去掉变量里面的4内容,方法b也是同样的逻辑,具体操作如下。
//方法a public String a(Integer flag){ ArrayList<Sting> list=Constant.cartImportDefaultHeadList; if(flag==1){ list.remove("4"); } .......... } |
//方法b public String b(Integer flag){ ArrayList<Sting> list=Constant.cartImportDefaultHeadList; if(flag==1){ list.remove("4"); } .......... } |
3:问题复现,方法a,b,都需要对flag=1的做特殊处理,当都是非flag=1的情况下,都是正常的,但是一旦出现这样的逻辑就会出现问题,具体流程如下。
1:请求访问a方法,并且flag的不等于1,此时静态变量的值没有变化,值为1,2,3,4 2:请求访问b方法,并且flag等于1,此时静态变量的值发生变化,值为1,2,3 3:在重复步骤1,最后得到的值为1,2,3正确结果应该为1,2,3,4 |
4:总结
小僧在这里简单描述了下,实际代码中比这复杂点,当时代码里面已经有现成的静态变量,直接拿来使用了,忽略了这个问题。
5:建议
有变更操作的尽量在自己方法内部单独创建对应的变量,这边避免别的方法污染。
在成为大牛的路上还有很多要悟,加油吧,骚年。