Proyecto Lombok: Reducci贸n del c贸digo repetitivo de Java

    Visi贸n general

    Lombok es una biblioteca de c贸digo abierto que se utiliza para reducir el c贸digo repetitivo en las clases de Java. Esto se logra reemplazando muchas de las piezas repetitivas de c贸digo con anotaciones simples y concisas.

    Lombok se inyecta a s铆 mismo en el proceso de compilaci贸n (a trav茅s de su proyecto / IDE) y autogenera el c贸digo de bytes para los m茅todos deseados en su .class archivos.

    Entonces, con Lombok, puede deshacerse de todos los m茅todos getter y setter, hashcode y m茅todos iguales y muchos m谩s simplemente agregando anotaciones.

    Configuraci贸n de Lombok

    Instalaci贸n de Lombok en Eclipse

    Descarga el Lombok .jar archivo de el sitio web oficial. Ejecute el descargado lombok.jar archivo o ejecute el comando en la terminal:

    java -jar lombok.jar
    

    Esto iniciar谩 el instalador:

    Si no detect贸 autom谩ticamente la ubicaci贸n de su IDE preferido, puede especificar la ubicaci贸n manualmente y luego finalizar la instalaci贸n haciendo clic en ‘Instalar / Actualizar’.

    Puede comprobar si la instalaci贸n est谩 activa o no en el cuadro de di谩logo “Acerca de” de Eclipse al final del texto de copyright:

    Instalaci贸n de Lombok en NetBeans

    Descarga el Lombok .jar desde el sitio web oficial y agregarlo a las bibliotecas del proyecto.

    Activar el plugin es tan f谩cil como seleccionar Project Properties -> Build - Compiling -> Enable Annotation Processing in Editor.

    Instalaci贸n de NetBeans

    Instalaci贸n de Lombok en IntelliJ

    IntelliJ Idea hace que sea realmente f谩cil instalar plugins en el IDE:

    • Ir File -> Settings -> Plugins y seleccione Browse Repositories
    • Buscar Lombok Plugin y haga clic en Install Plugin

    Despu茅s de esto, simplemente reinicie el IDE y estar谩 listo.

    Para otros IDE, puede visitar su p谩gina de inicio y consulte la secci贸n Instalar.

    Dependencia de Lombok

    Necesitamos agregar la siguiente dependencia en nuestro pom.xml:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>{version}</version>
        <scope>provided</scope>
    </dependency>
    

    Nota: El alcance es provided ya que Lombok es una dependencia de compilaci贸n pura y no de tiempo de ejecuci贸n. Esto significa que esperamos que la aplicaci贸n nos proporcione la dependencia del tiempo de ejecuci贸n.

    Anotaciones de Lombok

    @Getter y @Setter

    Estas anotaciones se pueden utilizar a nivel de campo o de clase. Si se usa a nivel de clase, generar谩 captadores y definidores para todos los campos de la clase:

    @Getter
    @Setter
    public class User {
    
        private String name;
        private String email;
    }
    

    Como se ve en la ventana IDE, ambos campos ahora tienen sus respectivos m茅todos getter y setter, aunque en realidad no los definimos nosotros mismos.

    Si desea getters / setters solo para ciertos campos, an贸telos en consecuencia:

    public class User {
    
        @Getter
        @Setter
        private String name;
        private String email;
    }
    

    Si desea cambiar el nivel de acceso de los m茅todos y campos generados, puede hacerlo utilizando el AccessLevel argumento:

    @Setter(AccessLevel.PROTECTED)
    private String email;
    

    Hay algunos niveles de acceso que ofrece Lombok en forma de argumentos:

    • M脫DULO
    • NINGUNA (Representa no generar nada o la falta total de un m茅todo)
    • PAQUETE
    • PRIVADO
    • PROTEGIDO
    • P脷BLICO

    Anotaciones de constructor

    @TodosConstructor

    los @AllArgsConstructor decorator generar谩 un constructor p煤blico con todos los campos declarados en su clase en el mismo orden en que est谩n definidos:

    @AllArgsConstructor
    public class User {
    
        private String name;
        private String email;
    }
    

    El constructor generado se ver铆a as铆:

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    

    @NoArgsConstructor

    @NoArgsConstructor generar谩 un constructor sin argumentos:

    @NoArgsConstructor
    public class User {
    
        private String name;
        private String email;
    }
    

    El constructor generado se ver铆a as铆:

    public User() {}
    

    Nota: Si el constructor no se puede generar debido a la presencia de final campos, aparecer谩 un mensaje de error.

    @RequiredArgsConstructor

    @RequiredArgsConstructor generar谩 un constructor con todos los final campos en la clase:

    @RequiredArgsConstructor
    public class User {
    
        private final String name;
        private String email;
    }
    

    El constructor generado se ver铆a as铆:

    public User(final String name) {
        this.name = name;
    }
    

    Nota: @NoArgsConstructor y @RequiredArgsConstructor no se pueden usar juntos y arrojar谩 un error de tiempo de compilaci贸n si intenta hacerlo.

    @EqualsAndHashCode

    @EqualsAndHashCode se puede usar usado a nivel de clase que generar谩 implementaciones para equals(Object other) y hashCode() m茅todos.

    De forma predeterminada, utilizar谩 todos los campos no est谩ticos y no transitorios:

    @EqualsAndHashCode
    public class User {
    
        private String name;
        private String email;
        private Integer age;
    }
    

    Si hay ciertos campos que no desea incluir en el equals o hashCode m茅todos, entonces podemos excluir esos campos espec铆ficos usando @EqualsAndHashCode.Exclude:

    @EqualsAndHashCode
    public class User {
    
        private String name;
    
        private String email;
    
        @EqualsAndHashCode.Exclude
        private Integer age;
    }
    

    Alternativamente, podemos especificar los campos que se incluir谩n usando @EqualsAndHashCode.Include y @EqualsAndHashCode(onlyExplicitlyIncluded = true):

    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    public class User {
    
        @EqualsAndHashCode.Include
        private String name;
    
        @EqualsAndHashCode.Include
        private String email;
    
        private Integer age;
    }
    

    @Encadenar

    Similar, @ToString se puede utilizar para generar el toString() implementaci贸n. De forma predeterminada, se imprimir谩n todos los campos no est谩ticos. Puede especificar si desea incluir u omitir ciertos campos mediante una combinaci贸n de @ToString.Exclude, @ToString.Includey @ToString(onlyExplicitlyIncluded = true) justo como antes:

    @ToString(onlyExplicitlyIncluded = true)
    public class User {
    
        @ToString.Include
        private String name;
    
        @ToString.Include
        private String email;
    
        private Integer age;
    }
    

    @Datos

    Es com煤n tener todas las anotaciones antes mencionadas en su POJO. En lugar de escribir una anotaci贸n para cada uno de ellos, Lombok proporcion贸 una anotaci贸n agregada @Data.

    Esto agrupa las caracter铆sticas de @Getter/@Setter, @EqualsAndHashCode, @ToString y @RequiredArgsConstructor juntos como si los hubieras apilado todos:

    @Data
    public class User {
    
        private final String name;
        private String email;
    }
    

    @Valor

    A veces desea que su objeto sea inmutable despu茅s de su creaci贸n. @Value es una variante inmutable de @Data y se utiliza exactamente para este prop贸sito.

    De forma predeterminada, todos los campos se hacen definitivos y no se crean establecedores:

    @Value
    public class User {
    
        private String name;
        private String email;
    }
    

    @Constructor

    El patr贸n Builder es un patr贸n de dise帽o de creaci贸n que se utiliza para ayudar a construir objetos paso a paso.

    Como ya sabr谩, si bien el patr贸n del constructor le permite crear instancias de objetos de una manera m谩s detallada y limpia que con los constructores, el c贸digo subyacente necesario para implementar el patr贸n es bastante complicado.

    @Builder le permite producir autom谩ticamente el c贸digo requerido para ello:

    @Builder
    @Data
    public class User {
    
        private String name;
        private String email;
    }
    

    Ahora puedes crear el User objeto utilizando el patr贸n Builder sin todo el c贸digo necesario para admitirlo:

        User user = new User.UserBuilder()
            .email("[email聽protected]")
            .name("test name")
            .build();
    
        System.out.println(user.getEmail());
    

    Inicio sesi贸n

    Es com煤n usar registradores en nuestra aplicaci贸n y, por lo general, necesitamos inicializar una variable de registro en la parte superior de la clase y luego usarla en nuestros m茅todos.

    Esto se puede lograr @Log que crea autom谩ticamente este campo:

    @Log
    public class Test {
    
        public static void main(String[] args) {
            log.severe("Log message");
        }
    }
    

    @Log crea una variable de registro con un java.util.logging.Logger.getLogger(LogExample.class.getName()) objeto.

    Lombok tambi茅n admite otros marcos de registro, que pueden ser utilizados por anotaciones como @Log4j, @Slf4j etc.

    Se puede ver la lista completa de marcos compatibles aqu铆.

    Escribir m茅todos seguros para subprocesos

    En Java para aplicaciones multiproceso, usamos el synchronized palabra clave en secciones cr铆ticas del c贸digo.

    Normalmente usamos un synchronized bloquear con un objeto como candado:

    public class SynchronizedJavaExample {
        private static final Object lock = new Object();
    
        public static void test() {
            synchronized (lock) {
                System.out.println("test");
            }
        }
    }
    

    Esto se puede generar autom谩ticamente con el @Synchronized palabra clave:

    public class SynchronizedExample {
    
        @Synchronized
        public static void test() {
            System.out.println("test");
        }
    
    }
    

    Conclusi贸n

    En este art铆culo, proporcionamos una introducci贸n al Proyecto Lombok y vimos c贸mo facilita nuestro proceso de desarrollo al reducir el c贸digo est谩ndar con anotaciones simples. Esto mejora dr谩sticamente la legibilidad y la brevedad.

    El c贸digo de los ejemplos utilizados en este art铆culo se puede encontrar en Github.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *