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

Apache Commons

Apache Commons — это коллекция библиотек, разработанных сообществом Apache Software Foundation, предоставляющих множество утилитарных классов и функций для общего использования в Java‑приложениях. Они обеспечивают реализацию стандартных операций, что позволяет упростить разработку и улучшить производительность кода. Несмотря на высокую ценность наборов утилит, у Apache Commons есть и недостатки.

Во‑первых, включение этой библиотеки может привести к увеличению размера проекта из‑за добавления дополнительных зависимостей. Это часто повышает сложность и время компиляции приложения.

Во‑вторых, существует возможность возникновения конфликтов версий при интеграции Apache Commons с другими библиотеками, что потребует дополнительных усилий по разрешению конфликтов. 

Пример кода с использованием Apache Commons для проверки на наличие символов в строке и отсутствие null может выглядеть следующим образом:

import org.apache.commons.lang3.StringUtils;
 
public class ApacheCommonsExample {
    public static void main(String[] args) {
        // Checking if a string is empty or null using Apache Commons
        String text = "Hello, Apache Commons!";
         
        if (StringUtils.isNotEmpty(text)) {
            System.out.println("The string is not empty or null.");
        } else {
            System.out.println("The string is either empty or null.");
        }
    }
}

Использование подобных функций упрощает написание кода и делает его более читабельным.

Apache Commons имеет активное сообщество разработчиков и обширную документацию для поддержки пользователей. Её модульная структура позволяет выбирать только необходимые компоненты, что минимизирует размер добавляемых зависимостей. Благодаря открытому исходному коду и лицензии Apache License, разработчики могут свободно использовать и модифицировать код библиотеки в соответствии с требованиями своих проектов.

Spring Framework

Spring Framework — один из самых популярных и мощных фреймворков, предоставляющий комплексный набор инструментов и библиотек для разработки масштабируемых и поддерживаемых приложений. Ключевыми аспектами Spring является поддержка паттерна инверсии контроля (Inversion of Control, IoC) и паттерна внедрения зависимостей (Dependency Injection, DI).

Приложение не само управляет жизненным циклом и зависимостями объектов, а делегирует эту ответственность фреймворку, который освобождает разработчика от необходимости заботиться о деталях и конфигурации. DI позволяет разработчикам описывать зависимости между компонентами приложения в виде конфигурации. А Spring внедряет эти зависимости в соответствующие объекты во время выполнения приложения.

Кроме того, экосистема Spring включает различные проекты и модули, такие как Spring MVC для создания веб‑приложений, Spring Data для упрощения доступа к базам данных, и Spring Boot для автоматизации процесса создания приложений с использованием соглашений и значений по умолчанию. Spring Framework также интегрируется с другими технологиями, такими как Hibernate для отображения объектов на реляционные базы данных (ORM), и предоставляет механизм декларативного управления транзакциями, что делает его популярным выбором для разработки приложений.

Пример кода, демонстрирующий использование внедрения зависимостей в Spring Framework:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class GreetingService {
 
    private final MessageProvider messageProvider;
 
    @Autowired
    public GreetingService(MessageProvider messageProvider) {
        this.messageProvider = messageProvider;
    }
 
    public String greet() {
        return "Hello, " + messageProvider.getMessage();
    }
}

Как и любого инструмента, у Spring Framework есть свои недостатки. Некоторые разработчики могут считать его избыточно сложным для небольших проектов или приложений, требующих минимальной конфигурации. Другие могут столкнуться с проблемами при разрешении зависимостей или управлении конфигурацией. Еще одним недостатком для многих стала необходимость поддерживать обширную документацию и изучать новые версии фреймворка, потому что это требует дополнительного времени и усилий. Некоторые также могут найти ограничения в гибкости и производительности, особенно в сравнении с более легкими или современными альтернативами. 

Guava

А это библиотека, разработанная Google. Она предлагает ряд утилит для работы со строками, потоками, функциональным программированием и другими задачами. Одной из основных особенностей Guava является предоставление дополнительных возможностей для работы с коллекциями, что включает в себя удобные методы для фильтрации, трансформации и комбинирования коллекций, а также такие специализированные коллекции, как Immutable, которые не могут быть изменены после создания.

Этот код демонстрирует использование библиотеки Guava для создания неизменяемого списка (ImmutableList) и вывода его элементов:

import com.google.common.collect.ImmutableList;
public class GuavaExample {
    public static void main(String[] args) {
        // Creating an immutable list using Guava
        ImmutableList<String> immutableList = ImmutableList.of("Java", "Guava", "Library");
        // Printing the elements of the immutable list
        for (String element : immutableList) {
            System.out.println(element);
        }
    }
}

Использование неизменяемых коллекций может повысить безопасность и предсказуемость кода, особенно в многопоточной среде.

Кроме того, Guava предоставляет поддержку функционального программирования в Java, включая функциональные интерфейсы, работу с лямбда-выражениями и функциональными операциями над коллекциями. Недостатками Guava могут быть затруднения в изучении и использовании некоторых его функций из-за их сложности или специфичности. Кроме того, некоторые разработчики могут столкнуться с проблемами с производительностью, особенно при работе с большими объемами данных или при использовании некоторых сложных операций.

Hibernate

Hibernate — это популярный фреймворк для объектно‑реляционного отображения (ORM). Одним из ключевых его преимуществ является способность скрыть сложности работы с базами данных, предоставляя разработчикам интерфейс на основе объектов. Это позволяет инженеру сосредоточиться на бизнес‑логике приложения, минимизируя необходимость вручную писать SQL‑запросы и обрабатывать результирующие наборы данных.

Hibernate также обеспечивает решение проблемы сопоставления объектов с таблицами базы данных, автоматически преобразуя данные из одного формата в другой. Кроме того, Hibernate поддерживает многопоточность и обработку транзакций, что делает его надежным и мощным инструментом для создания высокопроизводительных и масштабируемых приложений.

Пример кода, демонстрирующий использование Hibernate для работы с базой данных:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibernateExample {
    public static void main(String[] args) {
        // Конфигурация Hibernate из файла hibernate.cfg.xml
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
                // Создание фабрики сессий на основе конфигурации
        SessionFactory sessionFactory = configuration.buildSessionFactory();
                // Открытие сессии для взаимодействия с базой данных
        Session session = sessionFactory.openSession();
        
        // Начало транзакции
        Transaction transaction = session.beginTransaction();
        
        // Создание объекта, который мы хотим сохранить в базе данных
        Student student = new Student();
        student.setName("John Doe");
        student.setAge(25);
        
        // Сохранение объекта в базе данных
        session.save(student);
        
        // Завершение транзакции
        transaction.commit();
        
        // Закрытие сессии и фабрики сессий
        session.close();
        sessionFactory.close();
    }
}

Важно заметить, что класс Student должен быть отображен на соответствующую таблицу в базе данных с использованием механизма маппинга Hibernate.

Конечно, у Hibernate есть некоторые недостатки. Например, в случае неправильного использования или неправильной конфигурации он может привести к проблемам производительности или даже к утечкам ресурсов. Проблемой стать сложность настройки и использования, особенно для новичков. Также Hibernate иногда создает излишние запросы к базе данных в некоторых сценариях, что негативно сказывается на производительности приложения.

JUnit

JUnit является достойным инструментом для тестирования Java‑приложений, который помогает разработчикам создавать надежное и качественное программное обеспечение. Одной из наиболее интересных особенностей JUnit является его способность обеспечивать автоматизированное тестирование кода. Фреймворк позволяет разработчикам создавать модульные тесты для проверки отдельных компонентов программы, а также предоставляет удобные аннотации и методы для определения тестовых случаев. JUnit также поддерживает множество методов для организации, включая возможность группировки тестов, запуска их в заданном порядке и определения зависимостей между ними.

Одна из особенностей JUnit — это возможность описания тестов с использованием аннотаций, таких как @Test, @Before и @After, что делает процесс написания и организации тестов более декларативным и понятным. JUnit также предоставляет множество методов сравнения и проверки ожидаемых результатов, таких как assertEquals, assertTrue и assertNotNull, что облегчает формулирование условий тестирования. В случае провала теста, JUnit выводит сообщение об ошибке, что помогает разработчику быстрее идентифицировать проблему и исправить её.

Пример кода ниже демонстрирует написание теста для проверки правильности работы метода сложения add() класса MathOperations

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MathOperationsTest {

    @Test
    public void testAddition() {
        int result = MathOperations.add(3, 5);
        assertEquals(8, result, "Adding 3 and 5 should equal 8");
    }
}

Благодаря возможности создания собственных ассертов и расширений, разработчики могут адаптировать JUnit под свои потребности и требования проектов. Кроме того, фреймворк интегрируется с различными инструментами для непрерывной интеграции (CI), такими как Jenkins или Travis CI. Это автоматизирует процесс тестирования и обеспечивает непрерывную проверку качества кода во время разработки.

JUnit тестирование сосредоточено на модульном тестировании, а значит он не может е полностью охватить все аспекты приложения, особенно в случае сложных системных или интеграционных тестов. Еще одним недостатком является то, что JUnit тесты периодически подвергаются ложным срабатываниям. Особенно это происходит, когда тесты зависят от баз данных или внешних сервисов. 

Использование Java-библиотек и фрейморков — отличная возможность для разработчиков, позволяющим ускорить и упростить процесс создания программного обеспечения. Однако при выборе библиотеки необходимо внимательно анализировать её преимущества и недостатки, а также оценивать ее соответствие конкретным требованиям проекта.

Комментарии (6)


  1. Maccimo
    14.05.2024 06:57
    +20

    Что нам хотел сказать автор, смешав в одной короткой заметке поросшие мхом библиотеки, фреймворки, упоминаемые в каждой второй вакансии, и JUnit?

    Вероято то, что родилась сия публикация по воле кровожадных богов KPI, а не из желания поделиться чем-то полезным.

    Сама статья рассчитана на разработчиков начинающего уровня.

    Какую пользу она принесёт начинающему?
    Один абзац про JUnit не научит его писать модульные тесты и даже не покажет их полезность. А упоминания Apache Commons и Guava не дадут знания, что у части функциональности этих библиотек давно появились аналоги в стандартной библиотеке и предпочтительнее использовать их.

    Если вы — профессионал, посоветуйте в комментариях тот инструмент, который используете сами.

    У сантехника одни инструменты, у гастроэнтеролога — другие и при этом оба они могут быть профессионалами.


  1. AstarothAst
    14.05.2024 06:57
    +1

    В 2024 году открывать Америку и сообщать всему миру, что оказывается есть такая полезная штука, как jUnit - это сильно!


  1. LeshaRB
    14.05.2024 06:57
    +2

    Этот код демонстрирует использование библиотеки Guava для создания неизменяемого списка (ImmutableList) и вывода его элементов:

    List.of ?


    1. LedIndicator
      14.05.2024 06:57

      В Сбере работают на восьмёрке, очевидно. По крайней мере автор.


  1. lanseg
    14.05.2024 06:57
    +1

    От Hibernate я бы предпочел держаться подальше и использовать только в каких-то случаях, когда без него вообще никак не обойтись. Тот же MyBatis не такой жирный.


    1. man4j
      14.05.2024 06:57

      а я постоянно его юзаю. и если не использовать ассоциации то наоборот рекомендую.