Lombok.val te permite
use val como el tipo de una declaración de variable local en lugar de escribir el tipo. Cuando haga esto, el tipo se deducirá de la expresión del inicializador. La variable local también será definitiva.
Entonces, en lugar de
final ArrayList<String> example = new ArrayList<String>();Puedes escribir
val example = new ArrayList<String>(); He intentado investigar un poco sobre cómo funciona esto realmente, pero no parece haber una gran cantidad de información. Mirando la página de github , puedo ver que val es un tipo de anotación. A continuación, se utiliza el tipo de anotación, en lugar de una anotación real.
Ni siquiera sabía que podría usar tipos de anotaciones de esta manera, pero al probarlo, el siguiente código es realmente válido. Sin embargo, todavía no estoy seguro de por qué querrías usar el tipo de esta manera.
public class Main { public @interface Foo { } public static void main(String... args) { Foo bar; System.out.println("End"); } }¿Cómo procesa Lombok estos usos si no son anotaciones, sino tipos de anotaciones? Según mi entendimiento (obviamente incorrecto), la sintaxis debería parecerse más a:
@Val foo = new ArrayList<String>();(Soy consciente de que las restricciones de las anotaciones significan que lo anterior no es una sintaxis válida)
Para que Lombok funcione, el código fuente debe analizarse sin errores. Por eso, como ya mencionaste, @val foo = new ArrayList<String>(); no funcionaría
Aunque Lombok usa anotaciones y un procesador de anotaciones, el procesador de anotaciones solo se usa como un medio para que el compilador se involucre.
Lombok no tiene un procesador registrado para @val . En su lugar, procesa todos los archivos java, visita todo el AST y reemplaza val por el tipo de expresión de inicialización de las variables locales.
Para el reemplazo real, para Eclipse/ecj vea esta clase y esta . Para javac, consulte esta clase .
Divulgación: soy un desarrollador de Lombok.