Хватит изобретать велосипеды — почему Apache Commons Lang должен быть в каждом Java-проекте
Привет, коллеги! Сегодня хочу поговорить о классике, о том, что многие используют, но не все до конца осознают мощь этого инструмента. Знакома ситуация: вам нужно проверить, что строка не просто не null и не пустая, но и не состоит из одних пробелов? Или, может, склеить массив строк в одну через запятую, элегантно обработав null? Каждый раз мы пишем для этого свои маленькие утилиты, которые кочуют из проекта в проект.
А что, если я скажу, что все это и многое другое уже давно реализовано, оттестировано и ждет вас в одной маленькой, но невероятно полезной библиотеке? Встречайте, Apache Commons Lang — ваш швейцарский нож для повседневных задач в Java.
Что это за зверь и зачем он нужен?
Если коротко, Apache Commons Lang — это проект фонда Apache, который расширяет стандартную библиотеку Java (java.lang). Разработчики JDK, стремясь сохранить ядро языка компактным, часто не добавляют в него удобные, но не первостепенные утилиты. Команда Apache взяла на себя эту миссию: собрать самые частые операции, которые разработчики пишут сами, и предоставить для них пуленепробиваемые реализации.
По сути, эта библиотека — сборник статических методов-помощников для работы с базовыми типами: строками, числами, объектами, массивами. Главная её фишка — null-безопасность. Почти все методы в этой библиотеке не выбросят NullPointerException, если им на вход подать null, а вернут адекватное значение по умолчанию (например, false или пустую строку). Это одно из тех качеств, которое кардинально повышает надежность вашего кода.
Ключевые возможности: давайте посмотрим на код
Хватит общих слов, давайте к практике. Вот несколько киллер-фич, за которые вы полюбите эту библиотеку.
1. Магия работы со строками: StringUtils
Это, пожалуй, самый известный и используемый класс в библиотеке. Он делает работу со строками в разы приятнее.
Проверка на пустоту:
Забудьте про if (s != null && !s.isEmpty() && !s.trim().isEmpty()). Теперь есть элегантное решение:
// Проверяет на null, ""
StringUtils.isEmpty(null); // true
StringUtils.isEmpty(""); // true
StringUtils.isEmpty(" "); // false
StringUtils.isEmpty("bob"); // false
// Проверяет на null, "", " ", "\t", "\n"
StringUtils.isBlank(null); // true
StringUtils.isBlank(""); // true
StringUtils.isBlank(" "); // true
StringUtils.isBlank(" bob "); // false
Как видите, isBlank() — это именно то, что чаще всего нужно при валидации пользовательского ввода.
Другие полезные методы:
StringUtils.join(myArray, ", "): Склеивает элементы массива в строку через разделитель.StringUtils.abbreviate("Очень длинная строка", 15): Обрезает строку до нужной длины, добавляя в конце "...".StringUtils.capitalize("привет, мир"): Делает первую букву заглавной.StringUtils.isNumeric("123"): Проверяет, состоит ли строка только из цифр.
И это лишь верхушка айсберга!
2. Генерация equals(), hashCode() и toString() без boilerplate
Писать equals() и hashCode() вручную — занятие утомительное и чреватое ошибками. Конечно, современные IDE умеют генерировать их автоматически, но код получается довольно громоздким. Commons Lang предлагает элегантный подход с помощью билдеров.
Сравните сами.
До (классический подход):
public class User {
private String login;
private int age;
// ... конструкторы, геттеры
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && java.util.Objects.equals(login, user.login);
}
@Override
public int hashCode() {
return java.util.Objects.hash(login, age);
}
}
После (с Commons Lang):
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class User {
private String login;
private int age;
// ... конструкторы, геттеры
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
Код стал не только короче, но и надежнее. Методы reflectionEquals и reflectionHashCode используют рефлексию для сравнения полей. Это идеально для простых DTO. Если же рефлексия не подходит по соображениям производительности, можно использовать билдеры напрямую, перечисляя поля — код все равно будет чище.
А для красивого вывода в лог есть ToStringBuilder:
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
.append("login", login)
.append("age", age)
.toString();
// Вывод будет примерно таким: User[login=admin,age=30]
}
3. Утилиты для объектов: ObjectUtils
Еще один спасательный круг в борьбе с NullPointerException.
// Вернет "default", если myObject == null
String value = ObjectUtils.defaultIfNull(myObject, "default");
// Вернет первый не-null объект из списка
String winner = ObjectUtils.firstNonNull(null, null, "победитель", "еще один"); // вернет "победитель"
// Безопасное сравнение
ObjectUtils.compare(a, b); // не упадет, даже если a или b - null
Как начать использовать?
Проще некуда. Если вы используете Maven, просто добавьте эту зависимость в ваш pom.xml:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.20.0</version> <!-- Используйте актуальную версию -->
</dependency>
Обратите внимание, что artifactId — commons-lang3. Это третья, современная версия библиотеки, которая несовместима со второй. Сегодня стоит использовать именно её.
Выводы: кому и когда это нужно?
Ответ простой: почти всем и всегда.
- Для новичков: это отличный способ сразу начать писать более чистый и надежный код, не изобретая собственные утилиты.
- Для опытных разработчиков: это стандарт индустрии, который экономит время и делает код более предсказуемым и поддерживаемым. Когда новый человек приходит в проект и видит
StringUtils.isBlank(), он точно знает, что происходит.
Apache Commons Lang — это не та библиотека, которая меняет парадигму программирования. Это тот самый надежный набор инструментов, который лежит в ящике у каждого хорошего мастера. Он просто делает ежедневную работу проще, быстрее и качественнее.
Если по какой-то причине вы еще не включили эту библиотеку в свой список обязательных зависимостей для любого нового Java-проекта — самое время это исправить. Вы удивитесь, как много кода, который вы раньше писали вручную, можно заменить одним статическим методом.
