静态函数返回错误的值?
我有一个小的类,它包含一个静态最终变量和静态函数:静态函数返回错误的值?
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编译器做了一个优化,导致这种奇怪的行为,或者我错过了什么?
为帮助家伙们欢呼!发现问题,它似乎是我的本地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我设置了您的代码。它的工作方式和预期的一样,你的错误必须存在于你删除的代码的某些部分,以简化你的代码示例。
并始终认为您的静态代码必须执行。如果您从静态上下文中调用上述代码,则某些循环依赖可能会导致某些静态变量在被调用之前未被初始化
我的确同意,它不应该返回真实和错误,而是真实的,使世界上的所有感觉;-)因此,我的问题。我怀疑我可能会做出错误的事情。当我发现什么时,我会发表评论。 –
您未设置isOnline,您正在设置ONLINE。 – durbnpoisn
你真的运行过这个最简单的例子吗?也许你从代码中删除了一些重要的部分?我创建了一个项目并执行你的代码。它运行良好。 –
@Neuron不,它是一个大程序的一部分,但是两个log.debug行都在程序启动时调用,并相互调用。请注意,在eclipse中它工作正常,只有当我将它打包在可运行的jar中时,log.debug行会打印错误的值。 –