Упрощаем null-safe compareTo() в Java: решение на Java 8
Пройдите тест, узнайте какой профессии подходите
Простой и понятный подход
Самый простой способ обеспечения безопасности метода compareTo() при работе с null – это применение методов Comparator.nullsFirst
и Comparator.nullsLast
. Эти методы позволяют без труда встраивать вашу логику сравнения:
Comparator<String> nullSafeComparator = Comparator.nullsFirst(String::compareToIgnoreCase);
В данном случае null
рассматривается как меньший, чем любая непустая строка, при этом сравнение происходит без учета регистра.

Подробнее о различных подходах
Несмотря на удобство методов Java 8, существуют и другие способы реализации compareTo() для безопасной работы с null, особенно актуальные в сложных случаях.
Библиотеки: надёжная поддержка
Использование сторонних библиотек может стать отличным решением для упрощения процесса. Например:
Apache Commons Lang: предлагает метод
ObjectUtils.compare()
, который позволяет безопасно сравнивать объекты с учетом null.JavaСкопировать кодint result = ObjectUtils.compare("a", "b", true);
Guava's Fluent
Ordering
: если вам необходимо создать сложную цепочку правил сортировки, Guava предлагаетOrdering
, что и облегчает эту задачу.JavaСкопировать кодOrdering<Object> ordering = Ordering.natural().nullsFirst().onResultOf(Functions.identity());
Корректное сравнение строк и объектов без учета регистра
Работая со строками или объектами, важно использовать String.CASE_INSENSITIVE_ORDER
или подобные механизмы для корректного сравнения в compareTo().
Переиспользование компаратора
Для упрощения управления кодом и обеспечения единообразного поведения, создавайте статические компараторы:
public static final Comparator<MyObject> NULL_SAFE_COMPARATOR = Comparator.nullsFirst(MyObject::compareTo);
Специфическое сравнение с null
В некоторых случаях требуется особый подход к сравнению null. Здесь пригодятся пользовательские компараторы и вспомогательные методы:
public static int compareWithCustomNulls(MyObject a, MyObject b) {
if (a == null ^ b == null) {
return (a == null) ? -1 : 1;
}
if (a == null) {
return 0;
}
return a.compareTo(b);
}
Визуализация
Процесс применения null-безопасного compareTo() схож с упорядочиванием книг на полке, на которой могут быть пустые места:
Перед сортировкой: [📗, null, 📘, null, 📙]
Используем null-безопасный компаратор:
books.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
Теперь полка выглядит аккуратно отсортированной, а null находятся в начале:
После сортировки: [null, null, 📗, 📘, 📙]
Порядок сохранен, и null-значения занимают свое правильное место.
Избегание избыточности
Использование готовых возможностей библиотек делает код более чистым и оптимизированным.
Применение NullComparator
Для индивидуального контроля сравнения с null можно использовать NullComparator
из Apache Commons:
Comparator<MyObject> robustNullComparator = new NullComparator<>(false, false);
Важность тестирования
Нельзя игнорировать тестирование. Оно позволяет гарантировать корректную работу кода в ситуациях, когда появляется null.
Полезные материалы
- Comparable (Java Platform SE 8) — официальная документация по интерфейсу
Comparable
. - java – How to simplify a null-safe compareTo() implementation? – Stack Overflow — обсуждение на Stack Overflow.
- Comparable vs Comparator in Java – GeeksforGeeks — разница между
Comparable
иComparator
. - Java – How to Use Comparator? – Tutorialspoint — интерфейс
Comparator
с примерами. - Java Comparator (A introduction) – javatpoint — введение в интерфейс
Comparator
. - How to Sort a List in Java – DZone — руководство по сортировке списков с использованием
Comparator
и возможностей Java 8.