es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un constructor para un POJO de terceros.

¿Cómo puedo crear un constructor de Lombok para una clase de un tercero (es decir, no puedo modificar su código fuente)?

Tengo una clase existente que no puedo cambiar:

public class ThirdPartyPojo {
    // una de las muchas propiedades
    private String name;

    public ThirdPartyPojo() {
        // constructor predeterminado sin argumentos
    }

    String getName() {
        return this.name;
    }

    void setName(String name) {
        this.name = name;
    }

    // muchos más getters y setters
}

Ahora me gustaría crear un @Builder para obtener una API de constructor fluida que simplifique la instanciación de ThirdPartyPojo con valores predeterminados.

Esto es lo que intenté:

@Builder
public class ThirdPartyPojoBuilder extends ThirdPartyPojo {

    @Default
    private String name = "nombre predeterminado";

    // muchos más valores predeterminados para otras propiedades
}

El código se compila y puedo hacer referencia al constructor, por ejemplo:

ThirdPartyPojo pojoConNombrePredeterminado = ThirdPartyPojoBuilder.builder().build();
ThirdPartyPojo pojoConNombrePersonalizado = ThirdPartyPojoBuilder.builder().name("nombre personalizado").build();

System.out.println(pojoConNombrePredeterminado.getName());
System.out.println(pojoConNombrePersonalizado.getName());

Sin embargo, esto no funciona ya que getName() devuelve null tanto para pojoConNombrePredeterminado como para pojoConNombrePersonalizado.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible crear un generador de Lombok para una clase de terceros sin modificar su código fuente. Lombok funciona generando código en tiempo de compilación y, para hacerlo, necesita acceso al código fuente de la clase que se está construyendo.

    Tendrías que crear una clase envolvente alrededor de la clase ThirdPartyPojo que contenga la anotación @Builder y delegue a la clase ThirdPartyPojo original, de la siguiente manera:

    @Builder
    public class ThirdPartyPojoWrapper {
        private ThirdPartyPojo thirdPartyPojo;
    
        @Default
        private String name = "nombre predeterminado";
    
        public ThirdPartyPojoWrapper() {
            thirdPartyPojo = new ThirdPartyPojo();
            thirdPartyPojo.setName(name);
        }
    
        public ThirdPartyPojoWrapper name(String name) {
            thirdPartyPojo.setName(name);
            return this;
        }
    
        public ThirdPartyPojo build() {
            return thirdPartyPojo;
        }
    }
    

    Ten en cuenta que este enfoque crea una capa adicional de objetos entre tu código y la biblioteca de terceros, por lo que debes considerar si esta es una opción viable para tu caso de uso.

Comments are closed.