【问题标题】:Static function returns wrong value?静态函数返回错误值?
【发布时间】: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 编译器的优化转换为布尔值(因为它是最终的)。它仍然让我有点困惑。

标签: java function static


【解决方案1】:

看看this project 我用你的代码设置的。它按预期工作,您的错误必须存在于您为简化代码示例而删除的代码的某些部分。

并始终考虑必须执行您的静态代码。如果你从静态上下文调用上面的代码,一些循环依赖可能会导致一些静态变量在被调用之前没有被初始化

【讨论】:

  • 我确实同意它不应该返回 true 和 false,而是 true 和 true,这在世界上都是有意义的 ;-) 因此我的问题。我怀疑我可能会做一些可怕的错误。当我发现什么时,我会发表评论。
【解决方案2】:

为帮助的家伙干杯!发现了问题,我的本地 maven 存储库似乎丢失了保存 GlobalConstants 类的库的副本。此类作为依赖项包含在可运行 jar 中。但这并不能解释“假,真”输出,除非 GlobalConstants.ONLINE 通过 java 编译器的优化转换为布尔值(因为它是最终的)。还是有点迷惑。

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

System.out.println(GlobalConstants.ONLINE);
System.out.println(GlobalConstants.isOnline());

被java编译器转换为:

System.out.println(true);
System.out.println(GlobalConstants.isOnline());

现在一切都清楚了,这解释了我原来帖子中的结果。因为即使它使用了错误的类版本,它也应该产生相同的结果(真,真)。但是因为 java 编译器会变魔术,所以它可能返回 true、false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2021-01-09
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多