marstran
estoy usando lombok’s @Data
y @Builder
anotaciones como esta:
@Data
@Builder(toBuilder = true)
class Movie {
// Some other fields here.
private final List<Actor> actors;
}
Cuando creo un nuevo Movie
usando el constructor, sin especificar ningún actor, esperaría que Lombok inicializara mi Lista para Collections.emptyList()
. Pero esto no sucede:
List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints 'null'.
En la documentación de la @Builder
anotación, se indica en las líneas 55 y 56 en el código de ejemplo para Vanilla Java (https://proyectolombok.org/features/Builder.html) que debería mirar el ejemplo de código para @Singular
(https://projectlombok.org/features/Singular-snippet.html). En la línea 112 en el ejemplo de Vanilla Java aquí, parece que la lista debería inicializarse en la lista vacía.
Lo comprobé, y de hecho sucede si anoto la lista con @Singular
:
@Data
@Builder(toBuilder = true)
class Movie {
// Some other fields here.
@Singular
private final List<Actor> actors;
}
List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints '[]'.
¿Es esto un error en Lombok o hay algo que estoy haciendo mal? De acuerdo con la documentación, parece que la lista debe inicializarse a la lista vacía en ambos casos (porque el @Builder
documento se refiere a la @Singular
doc).
Solo cuando usas @Singular
, obtienes una lista vacía. Sobre el Página de documentación del constructor dice:
…con el
@Singular
anotación, lombok tratará ese nodo constructor como una colección.
Sin el @Singular
, lombok lo trata como cualquier otro objeto. Así será null
en lugar de una colección vacía.
Divulgación: soy un desarrollador de Lombok
-
¡Gracias! Por cierto, el
@Singular
La anotación da un error si el nombre de la variable de la colección no se puede singularizar. Sin embargo, esto es un poco inconveniente cuando tiene un sustantivo incontable como nombre de variable (como la palabra “equipo” u “oveja”). ¿Por qué el método singular generado no puede tener el mismo nombre que el plural, en lugar de dar un error de compilación?– marstran
30 de septiembre de 2015 a las 6:49
-
Nuestra breve investigación nos permite creer que no se usan muchas de esas palabras en el software real. Siempre que lombok no está seguro, nos equivocamos en el lado seguro. ¿No es una advertencia?
-Roel Spilker
1 oct 2015 a las 11:18
-
Me di cuenta de que solo puedo especificar el nombre así
@Singular("equipment")
, Y funcionó. ¡Gracias por tu ayuda!– marstran
1 oct 2015 a las 11:37
-
O puedes usar
@Builder.Default
anotación e inicialice que archivó usted mismo.– Ondřej Stašek
20 de marzo de 2019 a las 9:34
-
Traté de usar @Singular pero mi lista sigue siendo nula y no una lista vacía…
– Equivocado
27 de agosto de 2019 a las 7:14
Desde Lombok v1.16.16, puede usar la anotación interna de @Builder para inicializar su colección de manera predeterminada. Por ejemplo:
@Data
@Builder
class Movie {
@Builder.Default
private final List<Actor> actors = new ArrayList<>();
}
Entonces, cuando crea una nueva película usando el constructor, sin especificar ningún actor:
Movie movie = Movie.builder().build();
movie.getActors(); // Will return instance of ArrayList
-
Esto funcionó para mí (w Lombok v. 1.18.12). Para mí, esta fue la mejor respuesta, ya que resuelve exactamente el problema (igual que OP) sin necesidad de
@Singular
anotación, que cambia otras@Builder
comportamiento que no quería.– Wardibald
22 de abril de 2021 a las 8:23
-
Sin el
final
modificador, esto elimina el valor predeterminado para la llamada al constructor y podría resultar en NPE.–Valerij Dobler
19 de septiembre de 2022 a las 7:20
Por cierto, estoy usando la versión 1.16.6 de Lombok.
– marstran
28/09/2015 a las 13:55