Last Updated on 27/12/2023
A classe Java Objects é uma classe de utilidades introduzida no Java 7 e expandida no Java 8, que provê um coleção de métodos estáticos que ajudam a operar objetos Java. Ela possui métodos null-safe e tolerantes a nulo de um modo geral para computar o hash code de um objeto, retornar uma String representando seu estado, comparar sua equivalência, verificar se são nulos e muito mais.
De acordo com Brian Goetz (Arquiteto da Oracle da linguagem Java), as funcionalidades dessa classe também estão sendo introduzidas no core da linguagem, então há uma chance de que a classe Objects
fique mais popular nos anos que estão por vir.
Dito isto, estamos prestes a explorar como trabalhar com a classe Objects
.
Verificar se um parâmetro é nulo
Nós geralmente possuímos métodos ou construtores que recebem parâmetros obrigatórios, os quais nós gostaríamos de verificar se são nulos e são uma exceção caso venham a ser realmente nulos:
public class ObjectsExample { public void foo(String bar) { if (bar == null) { throw new NullPointerException(); } // Do something with bar... } }
Com a classe Objects, o mesmo comportamento pode ser codificado em uma única linha conforme a seguir, o código irá verificar se bar
é null
e lançar uma NullPointerException
caso positivo:
import java.util.Objects; public class ObjectsExample { public void foo(String bar) { Objects.requireNonNull(bar); // Do something with bar... } }
Você também pode utilizar sua versão de sobrecarga para prover informações adicionais, como a mensagem desejada em caso de exceção:
Objects.requireNonNull(bar, "Bar can't be null!");
Ou até mesmo prover um supplier que irá criar a mensagem da exceção somente caso necessário:
import java.util.Objects; public class ObjectsExample { public void foo(String bar) { Objects.requireNonNull(bar, this::createErrorMessage); // Do something with bar... } public String createErrorMessage() { return "Bar can't be null!!!"; } }
Comparar a equivalência de dois objetos de forma segura
Se você possui dois objetos para comparar sua equivalência utilizando Object.equals(Object), você precisará verificar se o primeiro argumento é null
antes de comparar:
public boolean baz(Object first, Object second) { if (first != null) { return first.equals(second); } return (second == null); }
Porém, utilizando Objects.equals(Object, Object) você pode se livrar desse null-check. O código abaixo produz a mesma saída do código anterior:
public boolean baz(Object first, Object second) { return Objects.equals(first, second); }
Invocar Object.toString() de forma segura
As vezes você precisa imprimir a representação textual de um objeto utilizando o método Object.toString(). Isso geralmente é útil quando você por exemplo, precisa imprimir o estado do objeto em um arquivo de log após uma exceção ter sido lançada:
logger.error("Xyz error. Foo's state: " + foo.toString());
Mas e se foo
for null
? Nossa velha e conhecida amiga NullPointerException
mal pode esperar para entrar em cena. Então, nós escreveríamos algo como o abaixo para garantir:
logger.error("Xyz error. Foo's state: " + foo == null ? "Foo is null" : foo.toString());
Um pouco verboso, mas podemos simplificar utilizando Objects.toString(Object):
logger.error("Xyz error. Foo's state: " + Objects.toString(foo));
Ou usar a versão de sobrecarga para prover uma mensagem a ser impressa caso foo
seja nulo:
logger.error("Xyz error. Foo's state: " + Objects.toString(foo, "Foo is null"));
Ainda não é tudo sobre Java Objects
Isto foi somente uma ideia do que a classe Objects
pode fazer por você. As vezes nós enchemos nossas aplicações com bibliotecas de terceiros buscando por métodos utilitários, mas geralmente nos conseguiríamos encontrá-los na própria JDK.
Para descobrir mais, visite o javadoc da Objects.
Espero que ajude.
Até mais!