martes, 20 de agosto de 2019

Ahorrando código con Google y AutoValue

Hoy vamos a hablar de una librería de Google que nos va a ayudar a ahorrar código necesario pero tedioso de realizar. Algo ya parecido vimos con Lombok aquí, en este caso se trata de AutoValue. Con esta librería podremos crear aquellas clases inmutables, que se les da valor y no son modificadas. 

Para que la anotación @AutoValue tenga el efecto deseado tenemos que crear la clase con una características concretas:
  • Añadir la anotación
  • Indicar que la clase sea abstracta.
  • Indicar métodos abstractos con los nombre de los campos que compongan la clase.
  • Indicar la visibilidad deseada (public o non public) tanto para la clase como para los métodos.
@AutoValue
public abstract class Book {
    public abstract String name();
    public abstract String author();
    public abstract Integer pages();
}

Y con todo esto, la anotación generará:
  • Un atributo por cada método abstracto.
  • Una implementación de cada uno de los métodos que devuelva el campo. 
  • Un constructor con todos los atributos. 
  • La implementación de los métodos equals, hashCode y toString.
  • La clase implementada tendrá el mismo nombre pero con AutoValue_ como prefijo.
Además es habitual crear un denominado factory method (no confundir con el patr'on), que nos permita generar de forma sencilla una instancia de la clase. Ejemplo:

public static Book valueOf(final String name, final String author, final Integer pages) {
    return new AutoValue_Book(name, author, pages);
}

A continuación veremos un ejemplo de su uso a través de un test JUnit:

@Test
public void metodo() {
    Book book = Book.valueOf("The stars my destination", "Alfred Bester", 214);
    assertThat(book.name(), equalTo("The stars my destination"));
    assertThat(book.author(), equalTo("Alfred Bester"));
    assertThat(book.pages(), equalTo(214));
    //Implementación del hashCode y equals
    assertThat(Book.valueOf("The stars my destination", "Alfred Bester", 214), equalTo(book));
    //Implementación del toString
    assertThat("Book{name=The stars my destination, author=Alfred Bester, pages=214}", equalTo(book.toString()));
}

En su documentación podreis encontrar además una amplia lista de caracteristicas disponibles, entre las que destacamos:
  • Utilizar el patrón Builder para crear instancias de la clase.
  • Utilizar los prefijos get o is en los métodos accesores pero no en el método toString. 
  • Permitir atributos nulos.
  • Aplicar validaciones a los atributos. 
  • Obviar determinados atributos en el equal.
Para poder utilizar solo tenemos que añadir la dependencia y su configuración para el procesamiento de la anotación a través del plugin compiler. Así:

<dependencies>
    <dependency>
      <groupId>com.google.auto.value</groupId>
      <artifactId>auto-value-annotations</artifactId>
      <version>1.6.5</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>com.google.auto.value</groupId>
            <artifactId>auto-value</artifactId>
            <version>1.6.5</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>

No hay comentarios:

Publicar un comentario