Мне было интересно, как были реализованы утверждения. Я обнаружил, что 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 -совместимыми или нет? Сложно ли компилятору использовать другое имя?
О пункте 2:. [** Non -нормативная ** информация, предназначенная для уточнения спецификации, дается в меньшем отступом тексте.] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-1.html#jls- 1.3) (Подчеркивает мое) – johnchen902
Именно поэтому я говорю «не предполагалось», а не «не разрешено». – yole