为何fileCheck的值未随bit变量的变化而同步更新?
问题:静态变量更新后关联变量未同步变化
期望修改静态变量bit的值时,静态变量fileCheck也随之更新,但运行代码后fileCheck始终输出check1file,未按预期变化。
代码示例
class HelloWorld { static String bit = "1"; static void changeBit(String profile) { if(profile.contains("0")) { bit = "0"; } } static String fileCheck = "check"+ bit +"file"; private static void checkFile() { System.out.println("val "+fileCheck); } public static void init(){ changeBit("file0"); System.out.println("Value of File from init "+ fileCheck); } public static void main(String[] args) { HelloWorld obj = new HelloWorld(); obj.init(); obj.checkFile(); } }
运行输出
Value of File from init check1file val check1file
原因分析
静态变量的初始化是在类加载阶段完成的,fileCheck = "check"+ bit +"file"这行代码只会在类第一次加载时执行一次,把当时bit的初始值("1")拼接后赋值给fileCheck。后续修改bit的值,并不会触发fileCheck的重新计算——它只是个普通的静态变量,不会和bit动态绑定。
解决方法
方法1:修改bit时同步更新fileCheck
每次修改bit的值后,手动重新计算并赋值给fileCheck:
static void changeBit(String profile) { if(profile.contains("0")) { bit = "0"; fileCheck = "check"+ bit +"file"; // 同步更新关联变量 } }
方法2:用静态方法替代静态变量(推荐)
把fileCheck改成静态方法,每次调用时动态计算,这样就能始终获取最新的bit值:
class HelloWorld { static String bit = "1"; static void changeBit(String profile) { if(profile.contains("0")) { bit = "0"; } } // 用静态方法动态计算,替代原静态变量 private static String getFileCheck() { return "check"+ bit +"file"; } private static void checkFile() { System.out.println("val "+ getFileCheck()); } public static void init(){ changeBit("file0"); System.out.println("Value of File from init "+ getFileCheck()); } public static void main(String[] args) { HelloWorld obj = new HelloWorld(); obj.init(); obj.checkFile(); } }
修改后运行输出:
Value of File from init check0file val check0file
内容的提问来源于stack exchange,提问作者NotACat
相关产品推荐
相关产品推荐

