静态函数返回错误的值?

问题描述:

我有一个小的类,它包含一个静态最终变量和静态函数:静态函数返回错误的值?

public class GlobalConstants { 
    public static final boolean ONLINE = true; 

    public static boolean isOnline(){ 
     return ONLINE; 
    } 
} 

(当然有一点重复代码,但请忽略)

我打包我的程序一个可运行的罐子,并得到奇怪的结果:

log.debug(GlobalConstants.isOnline()); //prints false 
log.debug(GlobalConstants.ONLINE); //prints true 

我希望他们都打印“真”。

是java编译器做了一个优化,导致这种奇怪的行为,或者我错过了什么?

+0

您未设置isOnline,您正在设置ONLINE。 – durbnpoisn

+4

你真的运行过这个最简单的例子吗?也许你从代码中删除了一些重要的部分?我创建了一个项目并执行你的代码。它运行良好。 –

+0

@Neuron不,它是一个大程序的一部分,但是两个log.debug行都在程序启动时调用,并相互调用。请注意,在eclipse中它工作正常,只有当我将它打包在可运行的jar中时,log.debug行会打印错误的值。 –

为帮助家伙们欢呼!发现问题,它似乎是我的本地Maven存储库丢失了持有GlobalConstants类的库的副本。该类作为依赖包含在可运行jar中。但是这并不能解释“false,true”输出,除非GlobalConstants.ONLINE被java编译器优化(因为它是最终的)而被转换为布尔值。它仍然让我困惑了一下。

[更新] 我反编译我的课,确实:

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。

看看this project我设置了您的代码。它的工作方式和预期的一样,你的错误必须存在于你删除的代码的某些部分,以简化你的代码示例。

并始终认为您的静态代码必须执行。如果您从静态上下文中调用上述代码,则某些循环依赖可能会导致某些静态变量在被调用之前未被初始化

+0

我的确同意,它不应该返回真实和错误,而是真实的,使世界上的所有感觉;-)因此,我的问题。我怀疑我可能会做出错误的事情。当我发现什么时,我会发表评论。 –