$assertionsDisabled 和 javac 标准合规性
$assertionsDisabled and javac standards compliance
我想知道断言是如何实现的。我发现 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 标准?编译器是否难以使用其他名称?
首先,javac 的行为与 JLS 指定的行为之间存在(或曾经存在)的实质性差异远不止于此。多年来,这种情况一直在改善,但仍然存在问题。所以不,javac 作为一个整体不符合标准。
其次,$ 符号 "should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems." 的 JLS says 从技术上讲,您编写的代码不是机械生成的,因此您不应该在变量名称中使用 $ 字符。
最后,选择另一个名称的代码需要编写、测试和维护,我认为 javac 开发团队已经找到了更有价值的领域来投入时间。
我想知道断言是如何实现的。我发现 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 标准?编译器是否难以使用其他名称?
首先,javac 的行为与 JLS 指定的行为之间存在(或曾经存在)的实质性差异远不止于此。多年来,这种情况一直在改善,但仍然存在问题。所以不,javac 作为一个整体不符合标准。
其次,$ 符号 "should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems." 的 JLS says 从技术上讲,您编写的代码不是机械生成的,因此您不应该在变量名称中使用 $ 字符。
最后,选择另一个名称的代码需要编写、测试和维护,我认为 javac 开发团队已经找到了更有价值的领域来投入时间。