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.

Error PMD: AccessorMethodGeneration al sobrescribir algunos métodos en el generador de Lombok Builder.

Tengo la siguiente clase que debería ser construida con Lombok @Builder:

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder(toBuilder = true)
public class Foo {
    private String myName;
    private int myAge;

    public static class FooBuilder {
        
        // Estoy sobreescribiendo este método para agregar cierta lógica de validación
        public FooBuilder myName(String myName) {
            // alguna lógica simple para validar "myName"
            
            this.myName= myName;
            return this;
        }
    }
}

Me gustaría agregar cierta lógica simple para validar el campo myName antes de establecerlo. Pero no quiero hacer eso por el campo myAge. Por lo tanto, el constructor del constructor de myAge y FooBuilder serán generados por Lombok.

Esto hace que PMD genere un error:

ReglaGeneraciónDelMétodoAccessor Prioridad:3 Evite los métodos generados automáticamente
para acceder a campos y métodos privados de clases internas/externas.

¿Debo suprimir este error o hay una mejor manera de lograr lo que quiero?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una opción para solucionar el error de PMD sería agregar la anotación @SuppressWarning a la clase Foo y especificar la regla PMD que se debe suprimir, así:

    @SuppressWarnings("PMD.DefaultPackage")
    @Getter
    @Builder(toBuilder = true)
    public class Foo {
        // ...
    }
    

    Sin embargo, un enfoque mejor sería crear una clase de construcción separada para la validación de myName y usarla en la anotación @Builder de la clase Foo. Aquí hay un ejemplo:

    import lombok.Builder;
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class Foo {
        private final String myName;
        private final int myAge;
    
        public static class FooNameBuilder {
            private String myName;
    
            public FooNameBuilder myName(String myName) {
                // agregar la lógica de validación aquí
                this.myName = myName;
                return this;
            }
    
            public Foo build(int myAge) {
                return Foo.builder()
                        .myName(myName)
                        .myAge(myAge)
                        .build();
            }
        }
    
        @Builder(builderMethodName = "nameBuilder", builderClassName = "FooNameBuilder")
        private Foo(String myName, int myAge) {
            this.myName = myName;
            this.myAge = myAge;
        }
    }
    

    En este ejemplo, hemos creado una clase de construcción separada FooNameBuilder con un método myName que incluye la lógica de validación. Hemos usado la anotación @Builder en el constructor privado para especificar el nombre de la clase de construcción como FooNameBuilder y proporcionar un nombre de método de construcción como nameBuilder.

    Ahora podemos usar este constructor para crear objetos Foo mientras validamos el campo myName.

    Foo foo = Foo.nameBuilder()
            .myName("John")
            .build(25);
    
    

Comments are closed.