Які великі вдосконалення між бібліотеками guava та apache еквівалентними?


123

В даний час ми використовуємо колекції apache, рядкові утиліти тощо. Мені потрібно вирішити, чи варто переходити від впровадження основ apache.

Важливим критерієм є простота використання розробниками. Продуктивність / використання пам'яті поки не є важливою проблемою для нас. Швидкість розвитку є ключовим критерієм на даний момент.

Я би вдячний думками про те, як життя розробника стало значно простішим через гуаву.

Відповіді:


223

По-перше, як пояснили 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 (поки що)


Дякую! * червоніє * Я щойно відредагував свою відповідь, щоб детальніше розповісти про дуже активний розвиток Гуави та детальніше ознайомитись з функціями Java 1.5.
Етьєн Невеу

1
Щойно зауважив, що Кевін Бурліон розповідає про Гуаву проти Apache Commons у цій розмові: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Етьєн Неве

Одне зауваження, Guava досить часто змінює свої API та застарає свої старі методи, тому наявність залежностей від нього може спричинити такі проблеми, як блокування версій та несумісність з іншими сторонніми бібліотеками, які використовують Guava.
Архімед Траяно

24

Я використовую guava з серпня 2010 року, починаючи з випуску r06. В основному, у мене була розробка бібліотеки Java-greenfield, тому я роздивився кращу бібліотеку додатків для API J2SE. Традиційно ми використовували бібліотеки Apache Commons, але я хотів подивитися, що там, і почав використовувати Guava.

Плюси

  1. Мовні конструкції Java 5.0. Бібліотека бере більшість своїх дизайнерських підказок з "Ефективної Java: 2-е видання" Блоха: Незмінність, модель розробника, фабрики замість конструкторів, Generics тощо. Це робить ваш код жорсткішим та виразнішим.
  2. Підтримка функціонального програмування, зокрема з інтерфейсами функцій та предикатів верхнього рівня.

Мінуси

  1. Це недостатня заміна для Apache Commons, зокрема commons-кодека.
  2. Немає «кулінарної книги гуави». Бібліотека є і мінімалістичною, і ортогональною. Таким чином, існує певна крива навчання, щоб повною мірою скористатися нею. Як вже згадувалося, Javadoc є чудовим, але деякі довші випадки вивчення вихідного коду були б корисні.
  3. Якщо ви знаходитесь в середовищі, що вимагає Java 1.3 або 1.4, вам не пощастить.

Для мене Гуава змушує Яву відчувати себе ближче до короткої, виразної мови сценаріїв, і це чудово.


16

В моєму досвіді я не вважаю, що вони суперечать один одному, або що гуава покращується на апаші. Швидше за все, гуава доповнює апачі. У гуаві є класи та утиліти, які не в апачі, і навпаки.

Тому я не знаю, що вам потрібно переключитися як таке - я б сказав "використовувати правильний інструмент для правильної роботи".


1
Я прийшов до цього висновку недавно, побачивши, що Guava не має нічого навіть близького до того, що пропонує Apache у FileNameUtils (так, це перекриття, але у FileNameUtils Apache є набагато більше, ніж у файлах Guava. Також, чому Google повинен використовувати Files? Тепер, коли я хочу щоб використовувати JDK Files, я мушу виписати весь шлях ...). Моєму додатку потрібно було багато утиліти File, тому я не міг уникнути використання Apache в цьому випадку.
Дон Чедл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.