Kurs Java Podstawy - rozszerzony

Klasa Objects

Java 7 wprowadziła nową klasę o nazwie Objects, która rozwiązuje sporo popularnych problemów, jednak niewiele osób zdaje sobie sprawę z jej istnienia. Jest ona zdefiniowana w pakiecie java.util, więc pełna ścieżka to java.util.Objects.

W klasie zdefiniowanych jest zestaw kilku użytecznych, statycznych metod, które przydadzą nam się m.in. do sprawdzania, czy pole jest nullem, ale także np. do wywoływania metody toString(), czy equals() w bezpieczny sposób.

Definiując metodę typu:

private boolean compareObjects(Object o1, Object o2) {
    return o1.equals(o2);
}

pojawia się problem. Co w sytuacji, gdy o1 będzie nullem? Otrzymamy wyjątek NullPointerException. Możemy pozbyć się problemu dodając warunek if:

public boolean compareObjects(Object o1, Object o2) {
    if(o1 != null)
        return o1.equals(o2);
    else
        return false;
}

Problem ten jest jednak na tyle powtarzalny, że najczęściej radzono sobie z nim korzystając z biblioteki apache commons, konkretnie metody equals klasy ObjectUtils. Jak możemy jednak przeczytać w dokumentacji metoda ta jest odradzana od Javy 7, gdzie została zastąpiona przez metodę o tej samej nazwie, ale z klasy Objects ze standardowej biblioteki Javy właśnie.

Poprawiona metoda powinna wyglądać więc następująco:

public boolean compareObjects(Object o1, Object o2) {
    return Objects.equals(o1, o2);
}

W podobny sposób rozwiązany został podobny problem dla metody toString(). Gdy nie mamy pewności, czy obiekt, na którym wywołujemy metodę toString() nie jest nullem, bezpieczniej jest posłużyć się metodą Objects.toString(), która w przypadku wartości null po prostu ją zwróci, zamiast rzucać NullPointerException.

public void safePrint(Object o) {
    System.out.println(Objects.toString(o));
}

Do najprzydatniejszych metod w tej klasie należą jeszcze:

  • deepEquals()
  • compare()
  • hashCode()

Komentarze