Каковы большие улучшения между эквивалентными библиотеками guava и apache? - PullRequest
123 голосов
/ 28 декабря 2010

В настоящее время мы используем коллекции apache, утилиты строк и т. Д. Мне нужно решить, следует ли нам переходить от реализации основ apache.

Важным критерием является простота использования разработчиками. Производительность / использование памяти пока не важны для нас. Скорость разработки является ключевым критерием на данный момент.

Буду признателен за мнение о том, как жизнь разработчика стала намного проще с гуавой.

Ответы [ 3 ]

223 голосов
/ 28 декабря 2010

Во-первых, как объяснил 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 (пока)

24 голосов
/ 29 декабря 2010

Я использую гуаву с августа 2010 года, начиная с версии r06.По сути, мне нужно было разработать новую библиотеку Java, поэтому я искал лучшую вспомогательную библиотеку для J2SE API.Традиционно мы использовали библиотеки Apache Commons, но я хотел посмотреть, что там, и начал использовать Guava.

Pros

  1. Языковые конструкции Java 5.0.Библиотека берет большую часть своих дизайнерских подсказок из «Эффективной Java: 2-е издание» Блоха: неизменяемость, шаблон компоновки, фабрики вместо конструкторов, универсальные шаблоны и т. Д. Это делает ваш код более тесным и выразительным.В частности, с интерфейсами функций и предикатов верхнего уровня.

Минусы

  1. Это не достаточная замена для Apache Commons, в частности для обыкновенного кодека.
  2. Там нет «поваренной книги гуавы».Библиотека является как минималистичной, так и ортогональной.Таким образом, есть определенная кривая обучения, чтобы в полной мере использовать ее.Как уже упоминалось, Javadoc превосходен, но некоторые более длительные примеры использования исходного кода были бы полезны.
  3. Если вы находитесь в среде, требующей Java 1.3 или 1.4, вам не повезло.

Для меня Guava заставляет Java чувствовать себя ближе к краткому, выразительному языку сценариев, и это здорово.

16 голосов
/ 28 декабря 2010

По своему опыту я не вижу, что они борются друг с другом или что гуава улучшает жизнь апачей. Скорее гуава дополняет библиотеки Apache. В guava есть классы и утилиты, которых нет в apache, и наоборот.

Поэтому я не знаю, что вам нужно переключаться как таковое - я бы сказал, «используйте правильный инструмент для правильной работы».

...