2009-04-08 10 views
6

La pregunta lo dice todo.Utiliza (o define) anotaciones no estándar, y por qué motivo. ¿Qué hay de las anotaciones recursivas?

Para los expertos, ¿hay alguna razón por la que el compilador SUN java 5 acepta anotaciones recursivas (al contrario que langspec), mientras que los compiladores posteriores no? Quiero decir, lo que podría ser un argumento contra anotaciones recursivas.

Editar: una anotación recursiva es algo así como:

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

Estaría interesado en ver un ejemplo de anotaciones recursivos, así como un uso para ellos. ¿Tiene alguna referencia que pueda publicar para completar un poco su pregunta? –

+0

No, no tengo tales referencias actualmente. Pero puedo decirte el uso: un compilador de un lenguaje funcional emite código java, y el código se anota con cierta información útil (como tipo, rigor, etc.) que el compilador recopiló. Por supuesto, la anotación para @Type es recursiva. – Ingo

Respuesta

2

Primera - No estoy seguro de lo que entendemos por anotaciones recursivas. ¿Te refieres a anotaciones que pueden contener referencias a otras anotaciones del mismo tipo? Algo así como

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

(lo cual sería un ejemplo de donde me gustaría utilizarlo si fuera posible ...)

En cuanto a mi uso de anotaciones personalizados (y procesadores): generación de código .

Ver http://code.google.com/p/javadude/wiki/Annotations

Por ejemplo, las propiedades 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... 
} 

o una confusión en el ejemplo

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 
} 

Ver The drawbacks of annotation processing in Java? y mi respuesta a ella por algunos problemas potenciales con su uso .

+0

Gracias por el convincente ejemplo de una anotación recursiva. Me tienes exactamente en lo cierto. +1 – Ingo

+0

¡genial! No sabía que podrías hacer eso en java5 ... lástima que no lo permitan :( –

+0

Incluso se pueden usar anotaciones recursivas compiladas con el compilador java5 en el código fuente y compilar eso con los compiladores java6. Es simplemente asombroso . – Ingo

1

He estado utilizando anotaciones recientemente, ya que se usa en gran medida por Oracle Weblogic Server para modificar el comportamiento de los servicios web de Java. Hay una lista completa de las anotaciones que definen here. En particular, termino usando su Policy annotation más, ya que de eso se basa su modelo de seguridad; Puedes ver sus ejemplos detallados en su documentation page.

Nunca escuché acerca de las anotaciones recursivas.

1

Uso anotaciones no estándar, generalmente para marcar campos de clase como objetivos para un proceso reflexivo, como el almacenamiento en memoria caché en llamadas RPC o procedimientos de inicialización específicos. Sin embargo, nunca tuve la necesidad de anotaciones recursivas ... Y creo que hay un problema potencial con eso, ya que las anotaciones deben procesarse en el momento de definición de la clase, antes de que los inicializadores estándar estén listos ... que fue lo que creo razón principal para limitar los contenidos de las Anotaciones a los tipos de base ...

+0

Gracias por el comentario. Sin embargo, sorprendentemente, en Sun SDK Java 5, las anotaciones recursivas funcionan muy bien. Lo que es aún más sorprendente, una vez que haya compilado su anotación recursiva con el compilador Java 5, puede usarlas (es decir, anotar algo) en el código fuente y compilar eso con Java 6! – Ingo

0

No conozco ningún buen argumento en contra de permitir anotaciones recursivas en general, salvo que ciertos casos patológicos que podría escribir por accidente podrían dar lugar a bucles infinitos (durante la compilación o el tiempo de ejecución) si no está prohibido.

javac prohíbe las definiciones de anotaciones recursivas simplemente porque eso es lo que requiere la especificación. Lo que dice la especificación en en una futura actualización de JLS (por ejemplo, para JDK 7) es otra cuestión.

Así que por favor leer y votar a favor:

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

Cuestiones relacionadas