За все время, проведенное в написании кода на Java, у меня сформировался определенный набор полезных cторонних библиотек, которые прочно засели в classpath, и без которых не обходится ни один день разработки, будь то написание чего-либо «на коленке» или работа над серьезным проектом. Речь идет не о «монстрах» вроде Spring, Struts, Hibernate (это другая история), а скорее об утилитах, которые заполняют пробелы в Java SE API и позволяют сэкономить десяток-другой лишних строк кода/минут тут и там. Этой информацией я бы и хотел поделиться с хабрасообществом — надеюсь, она пригодится особенно тем, кто только начинает штурмовать Java, и позволит немного, но увеличить производительность труда.
Итак, список наиболее часто используемых мной классов и методов с комментариями:
Apache Commons: Collections
Очень хорошая библиотека, во многом дополняющая Java SE Collections Framework. Очень полезна особенно тем, кто из-за «требований клиента» застрял на Java 2 SE 1.4.2 (бывает и такое) и до сих пор мечтает о LinkedHashMap :)
Работа с файлами — не самая сильная сторона платформы, которую любят использовать критики Java (иногда, заслуженно). Например, запрос на реализацию java.io.File.copy() висит уже 10 лет. Commons IO частично выручает:
Утилиты для работы со строками, reflection, сериализацией, объектами и системой. Пожалуй, наиболее часто используемая библиотека из Apache Commons.
Итак, список наиболее часто используемых мной классов и методов с комментариями:
Apache Commons: Collections
Очень хорошая библиотека, во многом дополняющая Java SE Collections Framework. Очень полезна особенно тем, кто из-за «требований клиента» застрял на Java 2 SE 1.4.2 (бывает и такое) и до сих пор мечтает о LinkedHashMap :)
- CollectionUtils. Пожалуй, наиболее часто используемый класс с кучей «вкусного»:
- filter/find(Collection, Predicate) — фильтрация и поиск по предикату.
- forAllDo(Collection, Closure) — выполняет Closure для каждого элемента (добавят ли они когда-нибудь Closure в Java?)
- is(Not)Empty(Collection) — позволяет не проверять на null перед вызовом (мелочь, но приятно, сравните с java.util.Collection.isEmpty())
- isEqualCollection(Collection, Collection) — никогда не приходилось сравнивать две коллекции вручную?
- Еще несколько десятков полезных методов.
- filter/find(Collection, Predicate) — фильтрация и поиск по предикату.
- ClosureUtils — для тех, кто давно мечтает о появлении полноценных Closure в Java.
- Много других классов разного уровня полезности (здесь и дальше я перечисляю наиболее часто используемые в моем случае).
- DbUtils
- closeQuietly(Connection, Statement, ResultSet) — работаете с JDBC напрямую? Надоело постоянно писать вложенные if/try/catch/finally для правильного закрытия ресурсов с проверкой на null? Тогда вам сюда :) Типичный код «из учебника»
try { // do some db work } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs!=null) rs.close(); } catch (Exception e) { e.printStackTrace(); } try { if (st!=null) st.close(); } catch (Exception e) { e.printStackTrace(); } try { if (conn!=null) conn.close(); } catch (Exception e) { e.printStackTrace(); } }
принимает более элегантную форму:
try { // do some db work } catch (Exception e) { e.printStackTrace(); } finally { DbUtils.closeQuietly(conn,st,rs); }
- closeQuietly(Connection, Statement, ResultSet) — работаете с JDBC напрямую? Надоело постоянно писать вложенные if/try/catch/finally для правильного закрытия ресурсов с проверкой на null? Тогда вам сюда :) Типичный код «из учебника»
Работа с файлами — не самая сильная сторона платформы, которую любят использовать критики Java (иногда, заслуженно). Например, запрос на реализацию java.io.File.copy() висит уже 10 лет. Commons IO частично выручает:
- FileUtils
- copyDirectory(File, File) — копирование директорий
- сopyFile(File, File) — копирование файлов
- listFiles(File, String[], boolean) — список файлов по расширению и рекурсивно. То, чему java.io.File так и не научился.
- readFileToString(File, String)
- writeStringToFile(File, String)
- copyDirectory(File, File) — копирование директорий
- IOUtils
- closeQuietly(Reader/Writer/InputStream/OutputStream) — также как и DbUtils, реально помогает избежать спагеттиподобного кода, который часто получается, когда нагромождаются if/try/catch/finally, чтобы просто закрыть I/O ресурс.
- copy(InputStream, OutputStream) — это классика.
- closeQuietly(Reader/Writer/InputStream/OutputStream) — также как и DbUtils, реально помогает избежать спагеттиподобного кода, который часто получается, когда нагромождаются if/try/catch/finally, чтобы просто закрыть I/O ресурс.
Утилиты для работы со строками, reflection, сериализацией, объектами и системой. Пожалуй, наиболее часто используемая библиотека из Apache Commons.
- StringUtils — огромное количество методов для манипуляций со строками.
- is(Not)Blank/Empty(String) — о
if (s!=null && s.trim().length()>0)
давно пора забыть.
- is(Not)Blank/Empty(String) — о
- StringEscapeUtils
- (un)escapeSql(String) — для тех, кто не пользуется PreparedStatement-и :)
- (un)escapeHtml(String) — куда ж Web-разработчику без этого.
- (un)escapeSql(String) — для тех, кто не пользуется PreparedStatement-и :)
- ToStringBuilder
- reflectionToString(Object) — реализация toString(), основанная на рефлексии. То есть, результат работы метода автоматически изменится при добавлении или удалении полей объекта. Для ленивых, вроде меня :)
- reflectionToString(Object) — реализация toString(), основанная на рефлексии. То есть, результат работы метода автоматически изменится при добавлении или удалении полей объекта. Для ленивых, вроде меня :)
- EqualsBuilder & HashCodeBuilder
- reflectionEquals/HashCode(Object). Методы, конечно же, должны использоваться вместе. Подходят, когда равенство двух oбъектов означает равенство значений всех полей. Eclipse-пользователи возразят, что уже давно есть опция меню «generate hashCode() and equals()». Однако, эти два Builder-а автоматически учитывают структурные изменения объекта в процессе его эволюции, такие как добавление полей.
- reflectionEquals/HashCode(Object). Методы, конечно же, должны использоваться вместе. Подходят, когда равенство двух oбъектов означает равенство значений всех полей. Eclipse-пользователи возразят, что уже давно есть опция меню «generate hashCode() and equals()». Однако, эти два Builder-а автоматически учитывают структурные изменения объекта в процессе его эволюции, такие как добавление полей.
- ExceptionUtils
- getFullStrackTrace(Throwable). За 13 лет у java.lang.Throwable так и не появилось простого, но нужного метода, который бы выдал трейс в виде String…
- getFullStrackTrace(Throwable). За 13 лет у java.lang.Throwable так и не появилось простого, но нужного метода, который бы выдал трейс в виде String…