1

Мне было интересно, как были реализованы утверждения. Я обнаружил, что 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 -совместимыми или нет? Сложно ли компилятору использовать другое имя?

ответ

1

Прежде всего, существуют (или используются) гораздо более существенные различия между поведением javac и поведением, указанным JLS, чем этот. За последние годы это улучшилось, но все еще есть проблемы. Так что нет, javac в целом не соответствует стандарту.

Во-вторых, JLS says, что знак $ должен использоваться только в механически сгенерированном исходном коде или, реже, для доступа к уже существующим именам в устаревших системах. " Технически код, который вы пишете, не генерируется механически, поэтому вы не должны использовать символ $ в своих именах переменных.

Наконец, код, чтобы выбрать другое имя должно быть написано, испытания и техническое обслуживание, и я полагаю, что команда разработчиков Javac нашел более ценные области инвестировать свое время в

+0

О пункте 2:. [** Non -нормативная ** информация, предназначенная для уточнения спецификации, дается в меньшем отступом тексте.] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-1.html#jls- 1.3) (Подчеркивает мое) – johnchen902

+1

Именно поэтому я говорю «не предполагалось», а не «не разрешено». – yole