Objects în Java

Clasa java.util.Objects are metode statice care lucrează sigur cu null; equals() compară două obiecte care pot fi null.

Sintaxă
public final class Objects
static boolean equals(Object a, Object b)
static boolean isNull(Object obj)   // Java 8
static boolean nonNull(Object obj)   // Java 8

Ce face Objects

java.util.Objects (atenție la „s” de la sfârșit) adună metode ajutătoare pentru obiecte, care nu aruncă NullPointerException când primesc null. Clasa trebuie importată: import java.util.Objects;.

Objects.equals(a, b) returnează true dacă ambele sunt null, false dacă doar unul este null și a.equals(b) în rest. Înlocuiește verificarea lungă a == null ? b == null : a.equals(b).

Objects.isNull(x) este x == null, iar Objects.nonNull(x) este x != null. Există ca să poată fi folosite ca referințe la metode în stream-uri: filter(Objects::nonNull).

Parametri

Parametru Descriere
a, b Obiectele comparate (pot fi null).
obj Obiectul verificat.

Ce returnează

boolean.

Exemple

Exemplul 1: equals care suportă null

import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        String a = null;
        String b = "Iași";
        System.out.println(Objects.equals(a, b));
        System.out.println(Objects.equals(null, null));
        System.out.println(Objects.equals("Iași", b));
        try {
            System.out.println(a.equals(b));
        } catch (NullPointerException e) {
            System.out.println("a.equals(b) aruncă NullPointerException");
        }
    }
}

Rezultat

false
true
true
a.equals(b) aruncă NullPointerException

Exemplul 2: Eliminarea valorilor null dintr-o listă

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        List<String> telefoane = Arrays.asList("0745111222", null, "0722333444", null);
        List<String> valide = telefoane.stream().filter(Objects::nonNull).toList();
        long lipsa = telefoane.stream().filter(Objects::isNull).count();
        System.out.println(valide);
        System.out.println("Lipsă: " + lipsa);
    }
}

Rezultat

[0745111222, 0722333444]
Lipsă: 2

Exemplul 3: Compararea câmpurilor opționale

import java.util.Objects;

public class Main {
    record Contact(String nume, String email) {}

    static boolean acelasiEmail(Contact x, Contact y) {
        return Objects.equals(x.email(), y.email());
    }

    public static void main(String[] args) {
        Contact ana = new Contact("Ana", "ana@exemplu.ro");
        Contact ion = new Contact("Ion", null);
        Contact radu = new Contact("Radu", null);
        System.out.println(acelasiEmail(ana, ion));
        System.out.println(acelasiEmail(ion, radu));
    }
}

Rezultat

false
true

Greșeli frecvente

  • Confunzi Object (clasa de bază) cu Objects (clasa de utilitare) și uiți importul java.util.Objects.
  • Folosești Objects.equals pentru array-uri: compară identitatea, nu conținutul. Folosește Arrays.equals.

Comenzi înrudite

  • Objects.hash: hash() calculează un cod hash din mai multe câmpuri (ideal în hashCode()); hashCode(o) dă 0 pentru null.
  • Objects.requireNonNull: requireNonNull() oprește imediat cu un mesaj clar dacă o valoare este null; requireNonNullElse() înlocuiește null cu o valoare implicită.
  • Objects.toString: Transformă un obiect în text fără să arunce excepție pentru null: dă „null” sau textul ales de tine.
  • Object.equals: equals() spune dacă două obiecte sunt „egale”, iar hashCode() dă un număr folosit de HashMap și HashSet; se suprascriu împreună.
  • Objects.compare: Compară două obiecte cu un Comparator dat; returnează 0 imediat dacă sunt același obiect (inclusiv ambele null).