Используете ли вы (или определяете) нестандартные аннотации и по какой причине. Как насчет рекурсивных аннотаций? - PullRequest
6 голосов
/ 08 апреля 2009

Вопрос говорит сам за себя.

Для экспертов, есть ли причина, по которой компилятор SUN java 5 принимает рекурсивные аннотации (в отличие от langspec), а более поздние - нет Я имею в виду, что может быть аргументом против рекурсивных аннотаций.

Редактировать: рекурсивная аннотация выглядит примерно так:

@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)

Ответы [ 4 ]

2 голосов
/ 08 апреля 2009

Во-первых, я не уверен, что вы подразумеваете под рекурсивными аннотациями. Вы имеете в виду аннотации, которые могут содержать ссылки на другие аннотации того же типа? Что-то вроде

@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)

(что было бы примером того, где я хотел бы использовать его, если бы это было возможно ...)

Что касается моего использования пользовательских аннотаций (и процессоров): генерация кода.

См. http://code.google.com/p/javadude/wiki/Annotations

Например, свойства JavaBean:

@Bean(
    properties={    
      @Property(name="name"),
      @Property(name="phone", bound=true),
      @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
    }
)
public class Person extends PersonGen {
    // generated superclass PersonGen will contain getters/setters
    //    field definitions, property change support...
}

или смешанный пример

package sample;

import java.util.List;

public interface IFlightAgent {
    List<IFlight> getFlight();
    void reserve(IFlight flight);
}

public interface ICarAgent {
    List<ICar> getCars();
    void reserve(ICar car);
}

public interface IHotelAgent {
    List<IHotel> getHotels();
    void reserve(IHotel hotel);
}

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Delegate;

@Bean(delegates = {
    @Delegate(type = IHotelAgent.class,
              property = "hotelAgent",
              instantiateAs = HotelAgentImpl.class),
    @Delegate(type = ICarAgent.class,
              property = "carAgent",
              instantiateAs = CarAgentImpl.class),
    @Delegate(type = IFlightAgent.class,
              property = "flightAgent",
              instantiateAs = FlightAgentImpl.class)
    }
)
public class TravelAgent extends TravelAgentGen
    implements IHotelAgent, ICarAgent, IFlightAgent
{
    // generated superclass TravelAgentGen will create instances
    //   of the "instantiateAs" classes and delegate the interface
    //   methods to them
}

См. Недостатки обработки аннотаций в Java? и мой ответ на некоторые возможные проблемы с их использованием.

1 голос
/ 08 апреля 2009

Я использую нестандартные аннотации, чаще всего для того, чтобы пометить поля класса как цели для рефлексивного процесса, такого как кэширование в вызовах RPC или специальные процедуры инициализации. У меня никогда не было необходимости в рекурсивных аннотациях, однако ... И я думаю, что есть потенциальная проблема с этим, так как аннотации должны быть обработаны во время определения класса, до того, как стандартные инициализаторы будут готовы ... что было основным причина ограничить содержание аннотации базовыми типами ...

1 голос
/ 08 апреля 2009

Я недавно использовал аннотации, так как они Oracle Weblogic Server интенсивно используются для изменения поведения веб-служб Java. Существует полный список аннотаций, которые они определяют здесь . В частности, я больше всего использую их аннотацию политики , поскольку именно на этом основана их модель безопасности; вы можете увидеть их подробные примеры на странице документации .

Я никогда не слышал о рекурсивных аннотациях.

0 голосов
/ 23 января 2010

Я не знаю ни одного хорошего аргумента против разрешения рекурсивных аннотаций в целом, кроме того, что некоторые патологические случаи, которые вы могли бы написать случайно, могли бы привести к бесконечным циклам (во время компиляции или выполнения), если не запрещено.

javac запрещает рекурсивные определения аннотаций просто потому, что этого требует спецификация. Что спецификация должна сказать в будущем обновлении JLS (скажем, для JDK 7) - это другой вопрос.

Пожалуйста, прочитайте и проголосуйте за:

http://bugs.sun.com/view_bug.do?bug_id=6264216

...