静态函数返回错误的值?

时间:2016-03-01 17:56:14

标签: java function static

我有一个包含静态最终变量和静态函数的小类:

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编译器是否正在进行导致这种奇怪行为的优化,或者我错过了什么?

2 个答案:

答案 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。