2009-07-13 1 views
7

Я случайно оставил дополнительную запятую в конце одного из моих аннотационных списков, но он скомпилирован на моей машине. Например:Являются ли аннотационные списки java допустимыми для дополнительной запятой после последней записи?

@NamedQueries({ @NamedQuery(name="name1",query="FROM Foo"), @NamedQuery(name="name2",query="FROM Bar"), })

Обратите внимание на дополнительные запятую после второго @NamedQuery. Кажется, он компилируется на моей машине, но у кого-то были проблемы с компиляцией кода на их машине, поэтому я удалил его. Но теперь мне любопытно, разрешено ли это, и если да, то какая версия java позволяет это.

Я не мог найти ссылку на это в любом месте в Интернете.

ответ

6

Я думаю, что в этом случае вы имеете дело с Array Initializers, которые допускают дополнительную запятую.

Пример:

int[] foo = new int[] { 1, 2, 3, };

Это было частью JLS с самого начала.

+0

> После последнего выражения в инициализаторе массива может появляться конечная запятая и игнорируется. (+1) – Tim

+2

Спецификация языка Java явно разрешает конечную запятую в массивах аннотаций (http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7). Однако, похоже, в javac есть ошибка, которая вызывает ошибку («незаконный запуск выражения»). Чтобы быть в безопасности, вы не должны использовать концевые запятые в аннотации, в то время как они вполне подходят в инициализаторах массива. –

4

Обратите внимание, что это будет работать в некоторых контекстах обработки аннотаций, а не в других. Если вы используете APT командной строки Sun, это приведет к неприятной ошибке. (Хорошо работает в затмении)