Translate

viernes, 14 de agosto de 2020

Records y Pattern Matching para instanceof en JDK 16


Todavia no me aprendo java 11 y ya tenemos noticias de java 16. Al parecer viene con registros, cosa que particularmente no me gusta y no entiendo la necesidad. Un ejemplo sería : 

record Name(String firstName, String lastName){}

Los registros se pueden declarar en un archivo separado o como parte de otra clase. 

Cuando se define una clase normal, implícitamente se agrega un constructor predeterminado. Los registros tienen un comportamiento similar y contienen implícitamente varios miembros:

  • Campos privados para todos los componentes del registro.
  • Métodos de acceso público para todos los componentes del registro.
  • Constructor con argumentos para todos los componentes del registro. Este constructor se denomina constructor canónico.
  • equals, toString y hashCode con su implementación.

El registro definido anteriormente no contiene ningún código personalizado, pero es posible definir métodos explícitos. Incluso es posible declarar explícitamente los diversos métodos agregados implícitamente y el constructor canónico. Por ejemplo, es posible crear un método toString personalizado.

En JDK 14, se requería que el constructor canónico fuera público. Desde JDK 15 en adelante, el constructor canónico implícito obtiene el mismo modificador de acceso que la clase de registro. Al definir un constructor canónico explícito, el modificador de acceso debe proporcionar al menos tanto acceso como la clase de registro.

Como parte del cambio, también se modificó la anotación @Override. Ahora se puede utilizar para anotar un método de acceso explícito en un registro.

También vamos a tener pattern matching para el instaceof. Ahora debemos hacer : 

if (person instanceof Customer) {

    Customer customer = (Customer) person;

    customer.pay();

}

y con pattern matching vamos poder hacer : 

if (person instanceof Customer customer) {

    customer.pay();

}

y podemos utilizarlo en el equals por ejemplo: 

@Override

public boolean equals(Object o) {

    return o instanceof Customer other &&

            name.equals(other.name);

}

Dejo link: https://www.infoq.com/news/2020/08/java16-records-instanceof/