$ assertionsDisabled和javac标准符合性

时间:2015-03-01 09:47:18

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

我想知道断言是如何实现的。我发现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是否合规?编译器是否难以使用其他名称?

1 个答案:

答案 0 :(得分:1)

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

其次,JLS says表示$ sign&#34;只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。&#34;从技术上讲,您编写的代码不是机械生成的,因此您不应该在变量名中使用$字符。

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