Compatibilidad hacia adelante se maneja mediante el procesamiento de lenguaje desconocido construye apropiadamente, por ejemplo implementando ElementVisitor.visitUnknown.
Hay otra entrada en el mencionado Oracle blog, lo que sugiere dos políticas respecto a la compatibilidad hacia adelante:
- Escribir el procesador para trabajar solamente con la versión de idioma actual.
- Escriba el procesador para hacer frente a construcciones futuras desconocidas.
La segunda se realiza mediante la devolución de SourceVersion.latest()
como ya se ha publicado en la pregunta.
Creo que está bien hacerlo en la mayoría de los casos, cuando está seguro de que los elementos de idioma adicionales no romperán nada. Por supuesto, no debe suponer que todo estará bien, incluso con las versiones más nuevas, debe probarlo también.
Ok, supongo procesamiento del lenguaje desconocido construye adecuadamente parece un poco extraño, así que aquí están algunos ejemplos.
Supone que tiene un procesador que busca un tipo personalizado de anotaciones en construcciones de lenguaje conocidas (anotaciones en una clase, por ejemplo) y crea una documentación simple de lo que ha encontrado. Probablemente sea seguro suponer que también funcionará en versiones más nuevas. Restringirlo a una versión particular no sería una buena decisión en mi opinión.
Supongamos que tiene un procesador que verifica todos los elementos que puede encontrar y analiza la estructura del código para generar un gráfico. Puede tener problemas con las versiones más nuevas. Es posible que pueda manejar construcciones de lenguaje desconocido de alguna manera (como al agregar un nodo desconocido al gráfico) pero solo haga esto si tiene sentido, y si vale la pena.Si el procesador simplemente ya no sería útil cuando se enfrenta con algo desconocido, probablemente debería apegarse a una versión java en particular.
Independientemente de la política utilizada, la mejor manera en mi opinión sería supervisar los próximos cambios en el idioma y actualizar el procesador en consecuencia. En Java 7, por ejemplo, project coin introdujo algunas características nuevas del lenguaje, que probablemente ni siquiera sean visibles para un procesador. Java 8 por otro lado tiene nuevas construcciones que afectarán el procesamiento, por ejemplo type annotations. Sin embargo, las nuevas características del lenguaje no ocurren tan a menudo, por lo que es probable que ni siquiera necesite cambiar nada durante mucho tiempo.
Gracias por su publicación inicial y la actualización. Todavía no acepté tu respuesta porque todavía estoy (muy a tiempo parcial) en el proceso de convertir un procesador de anotación en Java 7. Quiero ver si aparece algo más. – bernie