1. Знайомство з класом ObjectUtils

Методи:

allNotNull(Object... values) Перевіряє, що всі об'єкти не null
allNull(Object... values) Перевіряє, що всі об'єкти дорівнюють null
anyNotNull(Object... values) Перевіряє, що хоча б один об'єкт не null
anyNull(Object... values) Перевіряє, що хоча б один об'єкт null
clone(T obj) Клонує об'єкт
cloneIfPossible(T obj) Клонує об'єкт або повертає оригінал
compare(T c1, T c2) Порівнює об'єкти
defaultIfNull(T object, T defaultValue) Повертає default-об'єкт, якщо object дорівнює null
equals(Object object1, Object object2) Порівнює два об'єкти
notEqual(Object object1, Object object2) Перевірять, що два об'єкти не рівні
firstNonNull(T... values) Повертає перший об'єкт, який не null
getFirstNonNull(Supplier ... suppliers) Повертає перший об'єкт, який не null
getIfNull(T object, Supplier defaultSupplier) Повертає цей об'єкт, якщо він не дорівнює null, інакше повертає значення Supplier.get() переданого Supplier
hashCode(Object obj) Обчислює hashCode для об'єкта
hashCodeMulti(Object... objects) Обчислює hashCode для групи об'єктів
isEmpty(Object object) Перевіряє, що об'єкт empty або null
isNotEmpty(Object object) Перевіряє, що об'єкт не є empty або null
requireNonEmpty(T obj) Перевіряє, що об'єкт не null, інакше кидає виняток
requireNonEmpty(T obj, String message) Перевіряє, що об'єкт не null, інакше кидає виняток
identityToString(Object object) Повертає рядок для об'єкту
toString(Object obj) Повертає рядок для об'єкту
toString(Object obj, String nullStr) Повертає рядок для об'єкту
toString(Object obj, Supplier supplier) Повертає рядок для об'єкту

Давай розглянемо по одному методу з кожної групи. Я сподіваюся, ти часто ними користуватимешся, адже вони дуже зручні і дозволяють уникати зайвого коду.

2. ObjectUtils.compare()

Метод порівнює об'єкти за таким же принципом, як і comparator: більше, менше чи одно. Його можна використовувати для сортування об'єктів.

Сигнатура методу має вигляд:


public static <T extends Comparable<? super T>> int compare(final T c1, final T c2);
public static <T extends Comparable<? super T>> int compare(final T c1, final T c2, final boolean nullGreater);

Якщо третій параметр (nullGreater) дорівнює true, то null завжди вважатиметься більше, ніж null. Метод повертає позитивне значення, якщо c1> c2, негативне, якщо c1 <c2 і 0, якщо c1 == c2.

Приклад:


String firstValue = "javaRush";
String secondValue = "javaRush";
System.out.print(ObjectUtils.compare(firstValue, secondValue));
System.out.println();

firstValue = "javaRush";
secondValue = null;
System.out.print(ObjectUtils.compare(firstValue, secondValue));
System.out.println();

firstValue = "";
secondValue = "javaRush";
System.out.print(ObjectUtils.compare(firstValue, secondValue));
System.out.println();

Програма виведе на екран результат:

0
1
-8

3. ObjectUtils.isNotEmpty()

Метод isNotEmpty() перевіряє, що переданий об'єкт не порожній і не null.

Сигнатура методу:


public static boolean isNotEmpty(final Object object)

Приклад:


List<String> values = new ArrayList<>();
System.out.println(ObjectUtils.isNotEmpty(values));

values.add("javaRush");
System.out.println(ObjectUtils.isNotEmpty(values));

values = null;
System.out.println(ObjectUtils.isNotEmpty(values));

На екран буде виведено результат:

false
true
false

4. java.util.Objects

Розробникам Java дуже сподобалася ідея з ObjectUtils, так що в JDK 7 вони додали свій варіант:

isNull(Object obj) Перевіряє, що об'єкт дорівнює null
nonNull(Object obj) Перевіряє, що об'єкт не дорівнює null
toString(Object o) Перетворює об'єкт у рядок
toString(Object o, String nullDefault) Перетворює об'єкт у рядок
boolean equals(Object a,Object b) Порівнює об'єкти
boolean deepEquals(Object a,Object b) Порівнює об'єкти
T requireNonNull(T obj) Перевіряє, що переданий параметр не null
T requireNonNull(T obj,String message) Перевіряє, що переданий параметр не null
int hashCode(Object o) Обчислює hashCode для об'єкта
int hash(Object… values) Обчислює hashCode для групи об'єктів
int compare(T a,T b,Comparator c) Порівнює об'єкти

Оскільки клас java.util.Objects входить до складу JDK, рекомендується використовувати його в коді.

Важливо помітити, що коли ти читатимеш чужий код, то швидше за все зустрінеш варіанти з ObjectUtils, таке часто буває в open-source. Тут ти можеш подивитися, чим вони відрізняються.