我有一个包含静态最终变量和静态函数的小类:
public class GlobalConstants {
public static final boolean ONLINE = true;
public static boolean isOnline(){
return ONLINE;
}
}
(当然有一些代码重复,但请忽略它)
我将程序打包在一个可运行的jar中并得到奇怪的结果:
log.debug(GlobalConstants.isOnline()); //prints false
log.debug(GlobalConstants.ONLINE); //prints true
我希望他们都打印“真实”。
java编译器是否正在进行导致这种奇怪行为的优化,或者我错过了什么?
答案 0 :(得分:1)
看一下this project我设置的代码。它的工作方式与预期一致,您的错误必须位于您删除的代码的某些部分,以简化代码示例。
始终认为必须执行静态代码。如果从静态上下文调用上面的代码,一些循环依赖可能导致一些静态变量在被调用之前没有被初始化
答案 1 :(得分:0)
为帮帮人干杯!发现问题,似乎我的本地maven存储库丢失了包含GlobalConstants类的库的副本。该类作为依赖项包含在runnable jar中。但这并不能解释“错误,真实”和“#34;输出,除非通过java编译器的优化将GlobalConstants.ONLINE转换为布尔值(因为它是最终的)。它仍然让我感到困惑。
[更新] 我反编译我的课程确实:
System.out.println(GlobalConstants.ONLINE);
System.out.println(GlobalConstants.isOnline());
由java编译器转换为:
System.out.println(true);
System.out.println(GlobalConstants.isOnline());
现在一切都清楚了,这解释了我原帖中的结果。因为即使它使用了错误的类版本,它也应该产生相同的结果(true,true)。但是因为java编译器做了魔术,所以它可能返回true,false。