【问题标题】:$assertionsDisabled and javac standards compliance$assertionsDisabled 和 javac 标准合规性
【发布时间】:2015-03-01 09:47:18
【问题描述】:

我想知道断言是如何实现的。我发现javac 使用了一个静态字段$assertionsDisabled。我很好奇如果 $assertionsDisabled 已经被使用会发生什么。

public class Test {
    static final boolean $assertionsDisabled = Math.random() < .5;
    public static void main(String[] args) {
        assert false;
    }
}

我希望javac 使用另一个名称,就像其他自动名称生成的情况一样。不过……

C:\Users\...\src>javac -J-showversion Test.java
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

Test.java:1: error: the symbol $assertionsDisabled conflicts with a compiler-syn
thesized symbol in Test
public class Test {
^
Test.java:2: error: the symbol $assertionsDisabled conflicts with a compiler-syn
thesized symbol in Test
        static final boolean $assertionsDisabled = Math.random() < .5;
                             ^
2 errors

这让我想到了一个问题:这种编译器行为是否符合standard 标准?编译器使用其他名字有困难吗?

【问题讨论】:

    标签: java compiler-errors assertions standards-compliance name-collision


    【解决方案1】:

    首先,javac 的行为与 JLS 指定的行为之间存在(或曾经存在)比这个更大的差异。多年来,这种情况一直在改善,但仍然存在问题。所以不,javac 作为一个整体是不符合标准的。

    其次,JLS says 认为 $ 符号“应该只用于机械生成的源代码,或者很少用于访问遗留系统上预先存在的名称。”从技术上讲,您编写的代码不是机械生成的,因此您不应该在变量名中使用 $ 字符。

    最后,选择另一个名称的代码需要编写、测试和维护,我认为 javac 开发团队已经找到了更有价值的领域来投入他们的时间。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多