Соответствие стандартам $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 нашла более ценные области, чтобы потратить свое время.

Другие вопросы по тегам