Hace algunos meses atrás estudiando para la certificación de java 7, me entere de la existencia de la clase java.util.Objects, esta es una clase utilitaria compuesta en su totalidad de métodos estáticos que aunque lucen bastante simples, si que resultan de ayuda ahorrándonos algo de trabajo (tedioso), entre estos encontramos algunos para realizar comparaciones así como para el calculo del hash de un objeto, o también para evitar asignar null a objetos.
En este caso creo que no hay mejor forma que verlo en el código para que podamos apreciar su utilidad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
import java.util.Objects; public class ObjectsClassExample { static class Persona { private String nombre; private int edad; Persona() { } Persona(String nombre, int edad) { this.nombre = Objects.requireNonNull(nombre); //Arroja NullPointerException this.edad = edad; // si el parametro nombre es null } public String getNombre() { return nombre; } public void setNombre(String nombre) { //Arroja NullPointerException si el parametro nombre es null //siendo este el mensaje de la exception this.nombre = Objects.requireNonNull(nombre, "Es estrictamente necesario pasar un Nombre"); } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (getClass() != obj.getClass()) return false; Persona persona = (Persona)obj; if (edad != persona.edad) return false; if (!Objects.equals(this.nombre, persona.nombre)) //Compara si ambos objetos son iguales return false; return true; } @Override public int hashCode() { return Objects.hash(nombre, edad); //calcula el valor hash del conjunto de valores //en nuestro caso los atributos nombre y edad } @Override public String toString() { //Si el atributo nombre es null entonces //muestra la cadena "Sin Nombre" return "{Nombre: " + Objects.toString(nombre, "Sin Nombre") + " , Edad: " + edad; } } public static void main(String[] args) { Persona p1 = new Persona (); Persona p2 = new Persona ("Maria", 20); System.out.println("p1.toString(): " + p1); System.out.println("p2.toString(): " + p2); System.out.println("p1.equals(p2): " + p1.equals(p2)); System.out.println("p1.hashCode(): " + p1.hashCode()); System.out.println("p2.hashCode(): " + p2.hashCode()); p1.setNombre("Maria"); p1.setEdad(20); System.out.println("Despues de asignar valores -> p1.equals(p2): " + p1.equals(p2)); System.out.println("Despues de asignar valores -> p1.hashCode(): " + p1.hashCode()); try { p1 = new Persona(null, 20); } catch (NullPointerException e) { System.err.println("Mensaje: " + e.getMessage()); } try { p2.setNombre(null); } catch (NullPointerException e) { System.err.println("Mensaje: " + e.getMessage()); } } } |
Si ejecutamos el main de esta clase obtendríamos el siguiente resultado
1 2 3 4 5 6 7 8 9 10 11 |
p1.toString(): {Nombre: Sin Nombre , Edad: 0 p1.toString(): {Nombre: Sin Nombre , Edad: 0 p2.toString(): {Nombre: Maria , Edad: 20 p1.equals(p2): false p1.hashCode(): 961 p2.hashCode(): -1997440065 Despues de asignar valores -> p1.equals(p2): true Despues de asignar valores -> p1.hashCode(): -1997440065 Objects.hashcode(p1) -1997440065 Mensaje: null Mensaje: Es estrictamente necesario pasar un Nombre |
Además de los métodos utilizados existen un par más que son para calcular si dos (2) objetos son profundamente iguales y para realizar comparaciones.
¿Qué te ha parecido esta clase? ¿Ya la conocías? ¿La utilizas en tus desarrollos? y sino a que esperas.