Warum können nicht alle Anweisungen in Java kommentiert werden?

7

Ich stieß auf ein einfaches Problem, das naiv versuchte:

%Vor%

Dies ist illegal und muss neu kompiliert werden:

%Vor%

Ich habe das Problem auf ElementType zurückgeführt: Eine Aussage scheint kein gültiges Programmelement zu sein. Das ist ziemlich verwirrend - ich dachte, dass ein Statement so etwas wie ein Supertyp aller Programmierelemente ist.

  1. Gibt es einen theoretischen oder technischen Grund für die Einschränkung gültiger Elemente?

  2. Könnte es anders gemacht werden - also angenommen, ich könnte ElementType durch meine eigene Klasse ersetzen und die kräuselnden Veränderungen meistern, könnte ich irgendeine Aussage kommentieren?

kostja 11.06.2012, 13:41
quelle

4 Antworten

11

Wenn Sie sich das Javadoc für @SuppressWarnings Sie werden die Antwort sehen: Ihre erklärten Ziele sind

%Vor%

Mit anderen Worten, kann nicht legal auf eine Anweisung angewendet werden. Sie kann jedoch auf eine Variablendeklaration angewendet werden. Es hat nichts damit zu tun, ob eine Aussage ein Programmelement ist; Das liegt hauptsächlich daran, dass diese Anmerkung nur für Deklarationen von Dingen gilt.

Außerdem, wenn Sie das Javadoc für die Aufzählung betrachten das beschreibt Dinge, die Anmerkungen haben können, Aussagen und Ausdrücke gehören nicht zu den Möglichkeiten. Im Allgemeinen können Annotationen auf Deklarationen von Dingen angewendet werden, nicht auf Bits von Code.

Der theoretische Grund dafür ist, dass Annotationen nur als Eigenschaften einzelner Elemente gespeichert werden, die in der Klassendatei deklariert sind. Aussagen qualifizieren sich nicht; Wenn der Code kompiliert wurde, haben die Anweisungen aufgehört zu existieren. Es gibt nur einen Stream von Bytecode, und die einzige Erinnerung an die Anweisungen, von denen er kam, sind die (optionalen) Zeilennummerentabellen. Um damit umzugehen, müssten sie der Klassendatei ein neues Attribut hinzufügen, um auf die einzelnen Bytecodes zu verweisen, wie in diesem Vorschlag, und befassen sich mit einer Reihe von Komplexitäten, die als Ergebnis entstehen.

    
Ernest Friedman-Hill 11.06.2012, 13:48
quelle
5

Ich weiß, dass eine Antwort bereits akzeptiert wurde, und schmeiße sie einfach raus. Hier ist ein Auszug aus den FAQ für JSR-175 , die Java ursprünglich Anmerkungen hinzugefügt haben:

>
  

Warum können Sie keine willkürlichen Programmelemente wie Blöcke und einzelne Anweisungen annotieren?

     

Dies würde die Annotationssyntax stark verkomplizieren: Wir müssten die Einfachheit der Aussage, dass Annotationen einfach Modifikatoren sind, die für Deklarationen verwendet werden können, opfern.

Mit anderen Worten, weil es zu viel Arbeit ist: -)

    
Alex 11.06.2012 14:26
quelle
3

It wurde als Teil von JSR-308 , um Anmerkungen zu Anweisungen zuzulassen, aber derzeit wird es nicht unterstützt und ist nicht Teil der nächsten Java-Sprachversion (z. B. Java 8) .

Ich nehme an, dass zu der Zeit, als Anmerkungen der Sprache hinzugefügt wurden, die Hauptzielklassen- und Methodenlevelinformationen hauptsächlich um Laufzeit-Anwendungsfälle (z. B. Java EE, JPA, JAX-WS usw.) während der Anweisungsebene erstellt wurden Annotationen sind vor allem zur Kompilierzeit nützlich (siehe obigen Link zum Wiki für die Liste der Anwendungsfälle).

    
Eugene Kuleshov 11.06.2012 13:53
quelle
2

Eine Deklaration in Java ist eine Entität, die eine Kennung hat und von anderen Teilen des Programms referenziert werden kann. Eine Anweisung erfüllt dieses Kriterium nicht. Es ist eine Aktion, die möglicherweise dazu führt, dass einer deklarierten Entität ein Wert zugewiesen wird.

Abschnitt 6.1 der Java-Spezifikation ( Ссылка ) listet die Deklarationstypen auf, die auf die ElementType Aufzählungswerte ausgerichtet sind.

    
Alex 11.06.2012 13:51
quelle

Tags und Links