6

这个问题说明了一切。

对于专家来说,SUN java 5 编译器接受递归注释(与 langspec 相反)是否有原因,而后来的编译器不接受?我的意思是,反对递归注释的论据可能是什么。

编辑:递归注释类似于:

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

4 回答 4

2

首先——我不确定你所说的递归注释是什么意思。您是指可以包含对同一类型的其他注释的引用的注释吗?就像是

@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 中注释处理的缺点?以及我对它们使用的一些潜在问题的回答。

于 2009-04-08T14:52:33.897 回答
1

我最近一直在使用注解,因为Oracle Weblogic Server大量使用它来修改 Java Web 服务的行为。他们在这里定义的注释的完整列表。特别是,我最终最常使用他们的Policy 注释,因为这是他们的安全模型所基于的;您可以在他们的文档页面上查看他们的详细示例。

我从未听说过递归注释。

于 2009-04-08T14:58:59.030 回答
1

我确实使用非标准注释,最常见的是将类字段标记为自反过程的目标,例如 RPC 调用中的缓存或特定的初始化过程。然而,我从来不需要递归注释......而且我认为这有一个潜在的问题,因为注释需要在标准初始化程序准备好之前在类定义时处理......我认为这是主要的将注释内容限制为基本类型的原因......

于 2009-04-08T16:38:08.997 回答
0

我不知道有什么好的论据反对一般允许递归注释,除了你可能偶然编写的某些病理情况如果不被禁止可能会导致无限循环(在编译或运行时)。

javac 禁止递归注释定义仅仅是因为这是规范所要求的。规范在 JLS 的未来更新(例如,对于 JDK 7)中应该说什么是另一回事。

所以请阅读并投票:

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

于 2010-01-23T19:08:37.670 回答