Escribir código repetitivo o código que realmente no es necesario lleva mucho tiempo. El lenguaje Java tiene una gran comunidad que ha creado muchas bibliotecas que pueden ayudarlo a mejorar su rendimiento al eliminar la necesidad de escribir código repetitivo o proporcionar utilidades para resolver problemas comunes. En este artículo, echaremos un vistazo a algunas de estas bibliotecas.

1. El proyecto Lombok

Project Lombok

¿Cansado de los archivos que solo están llenos de métodos repetitivos como getters, setters, constructores, métodos anulados, etc.? Bueno, entonces Lombok es tu elección. La mayoría de los IDE pueden generar automáticamente métodos getter y métodos setter con solo hacer clic en un botón, pero la diferencia es que el IDE genera estos métodos en el propio archivo, mientras que Lombok genera todos los métodos directamente en el archivo. Además, Lombok nos ayuda a eliminar otros códigos repetitivos. Esto se ilustra mejor con algunos ejemplos:

public class StudentServiceWithoutLombok implements IStudentService {
private static final Logger log = Logger.getLogger(StudentServiceWithLombok.class);

@Override
 public void method1() {
  log.info("In method1 ");
 }
}

Arriba está el código sin Lombok, y ahora vamos a escribir el mismo código usando esta biblioteca.

@Log4j
public class StudentServiceWithLombok implements IStudentService {

@Override
 public void method1() {
  log.info("In method1 ");
 }
}

Ahora puede ver que no necesita inicializar la variable del Logger en el archivo, y es menos una línea, pero en proyectos grandes con miles de archivos, no tiene que escribir la misma línea una y otra vez. Permítanme darles otro ejemplo. A continuación, se muestra otra clase sin Lombok.

public class Student {
  
    private Integer rollNumber;
    private String name;
  
    public Student(Integer rollNumber, String name) {
        super();
        this.rollNumber = rollNumber;
        this.name = name;
    }
  
    public Integer getRollNumber() {
        return rollNumber;
    }
  
    public void setRollNumber(Integer rollNumber) {
        this.rollNumber = rollNumber;
    }
  
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
  
    
    @Override
    public String toString() {
        return "Student ["
            + "rollNumber=" + rollNumber
            + ", name=" + name + ", "
            + "]";
    }
}

Ahora, si tengo que escribir el mismo código con Lombok, se vería así:

@AllArgsConstructor
@Data
public class Student {
    private Integer rollNumber;
    private String name;
}

El ejemplo de Lombok no contiene código repetitivo y es mucho más fácil de leer.

Lombok elimina la mayor parte de su código repetitivo y le permite centrarse en la lógica empresarial, además de que su código se verá más ordenado. Hay mucho más en Lombok de lo que se menciona en este artículo: puedes ver todas las características interesantes del proyecto Lombok en el sitio web oficial.

2.MapStruct

MapStruct – Java bean mappings, the easy way!

¿Utilizas una arquitectura en capas en tu proyecto Java? Si es así, entonces definitivamente deberías considerar MapStruct. En una arquitectura en capas, las capas de aplicación están acopladas de forma flexible, por lo que habrá ocasiones en las que tendrá que asignar un objeto de un nivel a un objeto de otro nivel. Un ejemplo común es la asignación de entidades que residen en la capa de persistencia de datos a DTO en la capa de aplicación. Asignar un POJO simple a otro POJO puede requerir una gran cantidad de código repetitivo. Echemos un vistazo a las dos clases siguientes: la clase de entidad Student y su DTO, que desea asignar.

@Entity
@Data
public class Student {
    private Integer rollNumber;
    private String name;
}

@Data
public class StudentDTO {
    private Integer rollNumber;
    private String name;
}

Si necesita asignar dos clases, probablemente escribirá una clase de convertidor que contenga una función que tome como entrada Studenty devuelva como salidaStudentDTO, algo como esto:

public class StudenttoStudentDTOconvertor {

  public StudentDTO convert(Student student) {
    StudentDTO studentDTO = new StudenDTO();
    studentDTO.setName(student.getName);
    studentDTO.setRollNo(student.getRollNo());
    return studentDTO;
   }
}

Studentes una clase simple con solo dos campos, y puedes ver que necesitamos escribir cuatro líneas de código. Si hay más campos en esta clase, el número de líneas en el código del convertidor también aumentará. Para evitar escribir este código repetitivo simple, hay un MapStruct que generará automáticamente el código. Ahora vamos a reescribir el código de la clase del convertidor usando MapStruct.

@Mapper 
public interface StudenttoStudentDTOMapper  { 
    StudentDTO map(Student student);     
}

Realmente no tiene que implementar esta interfaz, MapStruct lo hará automáticamente. En cualquier caso, si decide agregar otro campo nuevo a la clase de entidad en el futuro, puede agregar el mismo campo al DTO y no tiene que realizar ningún cambio en la clase de resolución. Para obtener más información sobre otras características interesantes de MapStruct, visite su sitio web oficial.

3.Guava

GitHub - google/guava: Google core libraries for Java

No puedo explicar Guava mejor que su propio repositorio de GitHub:

GUAVA ES EL CONJUNTO DE BIBLIOTECAS PRINCIPALES DE JAVA DE GOOGLE QUE INCLUYE NUEVOS TIPOS DE COLECCIONES (COMO MULTIMAP Y MULTISET), COLECCIONES INMUTABLES, UNA BIBLIOTECA DE GRÁFICOS Y UTILIDADES PARA PARALELISMO, E/S, HASH, ALMACENAMIENTO EN CACHÉ, PRIMITIVAS, CADENAS Y MÁS. ES AMPLIAMENTE UTILIZADO EN LA MAYORÍA DE LOS PROYECTOS JAVA DE GOOGLE, ASÍ COMO EN MUCHAS OTRAS EMPRESAS.

Guava tiene utilidades que pueden ayudar a resolver no solo tareas simples de Java, sino también tareas muy complejas. Veamos un ejemplo:

public void checkAge(int age) {
      if(age<0)
      {
        throw new IllegalArgumentException(“age id invalid”);
      }
}

El mismo programa con la biblioteca Guava se puede escribir así:

public void checkAge(int age) {
      Preconditions.checkArgument(age > 0, “Invalid Age”);
}

Ambos programas hacen el mismo trabajo, pero el código que usa la biblioteca Guava es más limpio. Puede que no parezca mucho, pero hay mucho más. Pongamos otro ejemplo:

public void example() {
    // Inicializamos una colección LinkedHashMap de Guava
    Map<String, String> myMap = Maps.newLinkedHashMap();
    myMap.put("<span>name</span>", "abc");
    myMap.put("<span>rollno</span>", "123");
    String delimiter = "&";
    String separator = "=";
    String result = Joiner.on(delimiter).withKeyValueSeparator(separator).join(myMap);
    String expected = "name=abc&rollno=123";
    assertThat(result).isEqualTo(expected);
}

Desde el programa anterior, puede ver lo fácil que es convertir un mapa en una cadena con Guava, y además, si tiene algún problema en Java, ya sea relacionado con el almacenamiento en caché, el paralelismo o cualquier otra área, en la mayoría de los casos encontrará una solución en Guava. Para obtener más información sobre esta biblioteca, no olvide explorar su repositorio de Github.

4. Feign

GitHub - OpenFeign/feign: Feign makes writing java http clients easier

Si eres un desarrollador de Java, seguro que te has encontrado con situaciones en las que has tenido que llamar a algún tipo de API REST. Hay muchos clientes HTTP, como OkHttpClient, que se pueden usar para llamar a las API de REST, pero normalmente requieren una gran cantidad de código que no se ajusta en absoluto a las necesidades empresariales y, si llama a varias API, el código también se duplicará. Además de las bibliotecas de cliente HTTP, también hay bibliotecas contenedoras como RestTemplate, que hace la vida un poco más fácil. Un ejemplo de código escrito con OkHttpClient sería similar al siguiente:

OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://127.0.0.1/posts/1")
    .build();
Call call = okHttpClient.newCall(request);
try (Response response = call.execute();
     ResponseBody body = response.body()) {

String string = body.string();
  System.out.println(string);
} catch (IOException e) {
  throw new RuntimeException(e);
}

Tenga en cuenta la necesidad de agregar control de excepciones. También debe convertir la respuesta en objetos para que se pueda usar. ¿No crees que hay demasiado código aquí para llamar a una API REST simple? Veamos cómo se verá el código con RestTemplate.

final String uri = "https://127.0.0.1/posts/1"
RestTemplate restTemplate = new RestTemplate();
PostDTO result = restTemplate.getForObject(uri,PostDTO.class);

Bueno, en RestTemplate, todo es muy simple, y su respuesta también se convierte en un objeto que se usa más. Pero aún así, si estamos llamando a varias API REST, en cada una de ellas, necesitamos obtener la URL de las propiedades y llamar a la API mediante programación, y ni siquiera mencioné que todavía necesitamos controlar los errores. Hay dos formas de controlar los errores. La primera es simplemente escribir , pero luego se debe escribir el mismo código para cada llamada. Otra opción es un controlador de excepciones, pero en ambos casos es necesario escribir mucho más código. Ahora echemos un vistazo a cómo llamar a la API REST usando Feign:try-catch

@FeignClient(name="content-service", url="127.0.0.1")
public interface ContentService {
  @RequestLine("GET posts/{postNumber}")
  String getDocumentByType(@Param("contentType") String postNumber);
}

Feign generará automáticamente el código para llamar a la API REST, y los desarrolladores no tendremos que preocuparnos por nada. Si necesita agregar más API, puede agregar métodos y no volver a escribir el código. Feign tiene muchas más funciones: por ejemplo, podemos cambiar fácilmente la URL cambiando la configuración, y si desea volver a intentar alguna llamada a la API en caso de un error específico, Feign lo ayudará fácilmente a hacerlo. Feign también hace que sea más fácil probar el código. Echa un vistazo a más de las interesantes características de Feign en su repositorio de GitHub.

5. Hibernate

Hibernate. Everything data.

¿Odias escribir consultas SQL? ¿Olvidó cerrar la conexión de la base de datos después de ejecutar una consulta? Entonces esta biblioteca es solo para ti. Cuando intenta acceder a una base de datos, hay una gran cantidad de código repetitivo involucrado: debe abrir una conexión, ejecutar una consulta, convertir un conjunto de resultados en una entidad y cerrar la conexión, y también debe escribir consultas eficientes. Con Hibernate, no tendrás que preocuparte por nada de lo anterior.

Resumen:

En el mundo de la programación, todo el mundo quiere minimizar el código repetitivo en su aplicación, y tampoco quiere reinventar la rueda, porque a medida que se escribe más y más código, existe la necesidad de crear casos de prueba para validar cada línea, y siempre existe la posibilidad de que se produzca algún tipo de error. Hay muchas bibliotecas en Java que te ayudan a deshacerte del código repetitivo, y algunas bibliotecas proporcionan excelentes utilidades listas para usar, por lo que definitivamente no correrá el peligro de reinventar la rueda.

 

Compartir: