Java

Java Objects


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!

bgasparotto

Recent Posts

Python function decorator

This guide will show you how to create a Python function decorator with a few…

2 years ago

Got permission denied while trying to connect to the Docker daemon socket

This guide will show you how to fix the error Got permission denied while trying…

2 years ago

Python virtual environment on Intellij IDEA

This guide will show you how to create a Python virtual environment on Intellij IDEA…

2 years ago

Find and kill processes on Linux and Mac by port number

This tutorial will quickly show you how to to find and kill processes on Linux,…

2 years ago

Python: Relocation R_X86_64_PC32 against symbol can not be used when making a shared object Error

This guide shows a possible solution for Python error Relocation R_X86_64_PC32 against symbol can not…

2 years ago

Kubernetes useful commands

I condensed below a cheat sheet of Kubernetes useful commands. I will keep updating this…

2 years ago