Lombok @Builder no inicializa colecciones

3 minutos de lectura

avatar de usuario de marstran
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).

  • Por cierto, estoy usando la versión 1.16.6 de Lombok.

    – marstran

    28/09/2015 a las 13:55

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


¿Ha sido útil esta solución?