java циклические аннотации - PullRequest
4 голосов
/ 16 августа 2011

Я хочу создать древовидную структуру с аннотацией

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNode {
     String name();
     MyNode next() default null;
}

но компилятор сообщает, что это цикл и, следовательно, он не разрешен.

Интересно, почему это не разрешено и как мне сделать что-то подобное?

Ответы [ 3 ]

3 голосов
/ 25 января 2013

Это не древовидная структура, а просто линейный список. Попробуйте использовать массив, чтобы упростить объявление.

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNode {
     String name();
}

И упаковка:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNodes {
     MyNode[] value();
}

Теперь просто объявите как массив:

@MyNodes({ 
    @MyNode(name = "name1"),
    @MyNode(name = "name2")
})
public class MyClass {
}
1 голос
/ 16 августа 2011
  1. Аннотации являются константами времени компиляции.
  2. Члены аннотации могут быть только константами времени компиляции (строки, примитивы, перечисления, аннотации, литералы класса).
  3. Все, что ссылаетсясама по себе не может быть константой, поэтому аннотация не может ссылаться на себя.

Самое смешное: есть часть спецификации языка Java, которая, кажется, противоречит этому:

Аннотация в объявлении типа аннотации называется метааннотацией.Тип аннотации может использоваться для аннотирования своего собственного объявления.В более общем смысле, округлости в транзитивном замыкании отношения «аннотирует» разрешены.Например, допустимо аннотировать объявление типа аннотации другим типом аннотации и аннотировать объявление последнего типа первым типом.(Предопределенные типы метааннотаций содержат несколько таких цикличностей.)
[ Источник ]

Но я получаю ошибку компиляции для обоих этих вариантов (аннотация ссылается сама на себя):

public @interface Funky {
    Funky funky();
}

и это (две аннотации ссылаются друг на друга):

public @interface Funky {
    Monkey monkey();
}
public @interface Monkey {
    Funky funky();
}
0 голосов
/ 16 августа 2011

Если вам это действительно нужно, вы можете использовать компилятор Sun Java 5, где это ограничение не применяется.

Но, возможно, лучшим решением будет сохранить узлы в массиве и позволить каждому узлу иметь индекс (ы) своих дочерних узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...