【发布时间】:2016-03-01 17:56:13
【问题描述】:
我有一个包含静态最终变量和静态函数的小类:
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
我希望它们都打印“true”。
java 编译器是否进行了优化导致这种奇怪的行为,或者我错过了什么?
【问题讨论】:
-
你不是在设置isOnline,你是在设置ONLINE。
-
你真的运行过这个最小的例子吗?也许您从代码中删除了一些重要部分?我创建了一个项目并执行了您的代码。效果很好。
-
@Neuron 不,它是一个大程序的一部分,但是两个 log.debug 行都在程序启动时被调用,并且在彼此之后被调用。请注意,在 Eclipse 中它可以正常工作,只有当我将它打包到可运行的 jar 中时,log.debug 行才会打印错误的值。
-
@durbnpoisn isOnline 返回 ONLINE 变量,所以它们应该都返回相同的值(即 ONLINE 的值),但奇怪的是它们没有。
-
为帮助的家伙干杯!发现了问题,我的本地 maven 存储库似乎丢失了保存 GlobalConstants 类的库的副本。此类作为依赖项包含在可运行 jar 中。但这并不能解释“假,真”输出,除非 GlobalConstants.ONLINE 通过 java 编译器的优化转换为布尔值(因为它是最终的)。它仍然让我有点困惑。