Во-первых, как объяснил javamonkey79 , в то время как Google Guava и Apache Commons действительно имеют схожие функции, они также имеют функции, отсутствующие у их коллеги.Таким образом, ограничивать себя только одной библиотекой может быть неразумно.
При этом, если бы мне пришлось выбирать, я бы предпочел использовать Guava, сохраняя Apache Commons для (редких) случаев, когда Guava не делает этого.иметь необходимый функционал.Позвольте мне попытаться объяснить, почему.
Guava более "современный"
Apache Commons - действительно зрелая библиотека, но ей также почти 10 лет, и она ориентирована на Java 1.4.Guava был открытым исходным кодом в 2007 году , ориентирован на Java 5, и, таким образом, Guava значительно выигрывает от функций Java 5: generics , varargs , enums и autoboxing .
Согласно разработчикам из Guava, дженерики являются одной из причин, по которой они решили создать новую библиотеку вместо улучшения Apache Commons (см. * 1023).* Часто задаваемые вопросы по google-коллекциям , под заголовком "Почему Google построил все это, когда вместо этого мог попытаться улучшить Коллекции Apache Commons?" ).
Я согласенс ними: хотя и часто подвергаются критике (без ограничений, ограничены из-за обратной совместимости), дженерики 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) отлично работает, поддерживая высокий уровень качества / согласованности по всей библиотеке.Он, конечно, не одинок, и многие из великих разработчиков внесли свой вклад в Guava (даже Джошуа Блох , который сейчас работает в Google!).
ЯдроФилософия и выбор дизайна, лежащие в основе Guava, одинаковы во всей библиотеке, и разработчики придерживаются очень хороших (IMO) принципов проектирования API, извлекая уроки из прошлых ошибок API JDK (однако, не их ошибок).
Guava имеет высокое соотношение мощности к весу
Дизайнеры Guava сопротивляются искушению добавить слишком много функций, ограничивая API наиболее полезными.Они знают, что удалить добавленную функцию очень сложно, и следуют девизу Джошуа Блоха по разработке API: «Если сомневаетесь, оставьте его» * 1097 *.Кроме того, использование аннотации @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 (пока)