Хватит изобретать велосипеды — почему Apache Commons Lang должен быть в каждом Java-проекте

28 Jun, 2026
2,976
🔱 1,984
👥 164

Привет, коллеги! Сегодня хочу поговорить о классике, о том, что многие используют, но не все до конца осознают мощь этого инструмента. Знакома ситуация: вам нужно проверить, что строка не просто не null и не пустая, но и не состоит из одних пробелов? Или, может, склеить массив строк в одну через запятую, элегантно обработав null? Каждый раз мы пишем для этого свои маленькие утилиты, которые кочуют из проекта в проект.

А что, если я скажу, что все это и многое другое уже давно реализовано, оттестировано и ждет вас в одной маленькой, но невероятно полезной библиотеке? Встречайте, Apache Commons Lang — ваш швейцарский нож для повседневных задач в Java.

Java CI Maven Central Javadocs

Что это за зверь и зачем он нужен?

Если коротко, 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>

Обратите внимание, что artifactIdcommons-lang3. Это третья, современная версия библиотеки, которая несовместима со второй. Сегодня стоит использовать именно её.

Выводы: кому и когда это нужно?

Ответ простой: почти всем и всегда.

  • Для новичков: это отличный способ сразу начать писать более чистый и надежный код, не изобретая собственные утилиты.
  • Для опытных разработчиков: это стандарт индустрии, который экономит время и делает код более предсказуемым и поддерживаемым. Когда новый человек приходит в проект и видит StringUtils.isBlank(), он точно знает, что происходит.

Apache Commons Lang — это не та библиотека, которая меняет парадигму программирования. Это тот самый надежный набор инструментов, который лежит в ящике у каждого хорошего мастера. Он просто делает ежедневную работу проще, быстрее и качественнее.

Если по какой-то причине вы еще не включили эту библиотеку в свой список обязательных зависимостей для любого нового Java-проекта — самое время это исправить. Вы удивитесь, как много кода, который вы раньше писали вручную, можно заменить одним статическим методом.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.