По-перше, як пояснили javamonkey79 , хоча Google Guava та Apache Commons діють подібні функції, вони також мають функціонал, який відсутній у їхнього колеги. Таким чином, обмежувати себе лише однією бібліотекою може бути нерозумно.
Однак, якщо мені доведеться вибирати, я б вирішив використовувати Guava, зберігаючи Apache Commons для (рідкісних) випадків, коли Guava не має необхідної функціональності. Дозвольте спробувати пояснити, чому.
Гуава більш "сучасна"
Apache Commons - це справді зріла бібліотека, але їй також майже 10 років і націлена на Java 1.4. Гуава була відкрита в 2007 році , націлена на Java 5, і, таким чином, Guava значно виграє від можливостей Java 5: дженерики , вараги , перерахунки та автобоксинг .
За словами розробників Guava, generics є однією з причин, що вони вирішили створити нову бібліотеку замість того, щоб покращувати Apache Commons (див. Поширені запитання Google-колекцій під заголовком "Чому Google створив усе це, коли міг спробувати покращити Apache" Commons Collections замість цього? " ).
Я погоджуюся з ними: хоча вони часто піддаються критиці (відсутність змін, обмежена через зворотну сумісність), дженерики Java все ще дуже корисні при належному використанні, як це робить Guava. Я б швидше кинувся, ніж працював з не узагальненими колекціями!
(Зверніть увагу , що Apache Commons 3.0, робить цільової Java 1.5 +)
Гуава дуже добре розроблений / задокументований
Код переповнений кращими практиками та корисними зразками, щоб зробити API більш читабельним, відкритим, відкритим, ефективним, безпечним, захищеним від потоку ...
Прочитавши Ефективну Java (дивовижна книга BTW), я бачу ці шаблони скрізь у коді:
- заводські методи (наприклад
ImmutableList.copyOf()
)
- будівельник шаблон (
ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...)
- незмінність (незмінні колекції,
CharMatcher
, Joiner
, Splitter
, ...)
- приховування реалізації (
Predicates.xXx
, ...)
- користь композиції над спадщиною (
ForwardXXX
колекції)
- нульові перевірки
- enum-singleton візерунок
- проксі-сервери
- добре продумані конвенції про іменування
Я міг би продовжувати години, пояснюючи переваги, які принесли ці рішення дизайну (скажіть, чи хочете ви мене). Справа в тому, що ці зразки не тільки "для показу", вони мають справжню цінність: API - це приємно користуватися, легше вчитися (чи я забув сказати, наскільки добре це задокументовано?), Більш ефективний та багато класів простіші / безпечні для потоків через їх незмінність.
Як бонусний бал, людина багато чому вчиться, дивлячись на код :)
Гуава послідовний
Кевін Бурліон (провідний розробник Guava) чудово працює, підтримуючи високий рівень якості / послідовності в бібліотеці. Він, звичайно, не один, і багато чудових розробників зробили свій внесок у Гуаву (навіть Джошуа Блох , який зараз працює в Google!).
Основні філософії та вибір дизайну Guava послідовні у всій бібліотеці, і розробники дотримуються дуже хороших принципів дизайну API (IMO), довідавшись від минулих помилок API JDK ( однак не їх помилок).
Гуава має високе співвідношення потужність до ваги
Дизайнери Guava протистоять спокусі додати занадто багато функцій, обмеживши API лише найкориснішими. Вони знають, що дуже важко видалити функцію, щойно додана, і слідувати девізу Джошуа Блоха щодо дизайну API: "Коли ви сумніваєтесь, залиште це" . Також використання анотації @Beta дозволяє перевірити деякі варіанти дизайну, не привласнюючи конкретний API .
Згадані вище варіанти дизайну дозволяють отримати дуже компактний API. Просто подивіться на MapMaker, щоб побачити потужність, накопичену всередині "простого" конструктора. Інші хороші (хоч і простіші?) Приклади - це CharMatcher , Splitter та Ordering .
Також дуже просто складати різні частини Гуави. Наприклад, скажіть, що ви хочете кешувати результат складної функції ? Подайте цю функцію в MapMaker та BINGO, ви отримали безпечну для потоків обчислювальну карту / кеш. Потрібно обмежувати введення карти / функції певними рядками? Немає проблем, загорніть його всередину ConstrainedMap , використовуючи CharMatcher для відхилення невідповідних рядків ...
Гуава знаходиться в активному розвитку
Хоча розвиток Apache Commons, здається, прискорився з роботою над Commons Lang 3.0, на сьогоднішній день Guava набирає більше пари, тоді як Google відкриває джерела більше своїх внутрішніх класів.
Оскільки Google сильно покладається на це внутрішньо, я не думаю, що він скоро зникне. Крім того, відкриті джерела пошуку загальних бібліотек дозволяють Google легше відкривати інші бібліотеки, які залежать від цього (замість того, щоб перепакувати їх, як це робить Guice ).
Висновок
З усіх вищезазначених причин Guava - це моя бібліотека, коли я починаю новий проект. І я дуже вдячний Google та чудовим розробникам Guava, які створили цю фантастичну бібліотеку.
PS: Ви також можете прочитати це інше питання
PPS: я не маю жодних акцій Google (поки що)