Соответствие стандартам $assertionsDisabled и 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
Это привело меня к вопросу: стандартно ли это поведение компилятора или нет? Есть ли у компилятора трудности с использованием другого имени?
1 ответ
Прежде всего, есть (или раньше) гораздо более существенные различия между поведением javac и поведением, заданным JLS, чем это. Это улучшилось за эти годы, но все еще есть проблемы. Так что нет, javac в целом не соответствует стандартам.
Во-вторых, JLS говорит, что знак $ "должен использоваться только в механически сгенерированном исходном коде или, редко, для доступа к уже существующим именам в устаревших системах". Технически код, который вы пишете, не генерируется механически, поэтому вы не должны использовать символ $ в именах переменных.
Наконец, код для выбора другого имени должен быть написан, протестирован и поддержан, и я предполагаю, что команда разработчиков javac нашла более ценные области, чтобы потратить свое время.