我想知道断言是如何实现的。我发现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是否合规?编译器是否难以使用其他名称?
答案 0 :(得分:1)
首先,javac的行为与JLS指定的行为之间存在(或曾经是)更为实质性的差异。这种情况多年来一直在改善,但仍存在问题。所以不,javac作为一个整体不符合标准。
其次,JLS says表示$ sign&#34;只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。&#34;从技术上讲,您编写的代码不是机械生成的,因此您不应该在变量名中使用$字符。
最后,选择其他名称的代码需要编写,测试和维护,我认为javac开发团队已经找到了更多有价值的领域来投入时间。