Jakie są duże ulepszenia między bibliotekami guava i Apache?

Obecnie używamy kolekcji apache, string utils, itp. Muszę zdecydować, czy powinniśmy przełączyć się z implementacją Apache foundations.

Ważnym kryterium jest łatwość obsługi programistów. Wydajność/wykorzystanie pamięci nie jest dla nas jeszcze ważnym zagadnieniem. Szybkość rozwoju jest kluczowym kryterium w tym momencie.

Byłbym wdzięczny za opinie o tym, jak życie dewelopera stało się znacznie łatwiejsze z guava.

Author: Etienne Neveu, 2010-12-28

3 answers

Po pierwsze, jak wyjaśniono javamonkey79 , podczas gdy Google Guava i Apache Commons mają podobne funkcje, oba mają funkcjonalność, która jest nieobecna w ich odpowiedniku. Dlatego ograniczanie się do tylko jednej biblioteki może być nierozsądne.

To powiedziawszy, gdybym miał wybierać, zdecydowałbym się użyć Guava, trzymając Apache Commons w pobliżu (rzadkich) przypadków, w których Guava nie ma potrzebnej funkcjonalności. Spróbuję wyjaśnić dlaczego.

Guawa jest bardziej "modern"

Apache Commons jest naprawdę dojrzałą biblioteką, ale ma też prawie 10 lat, a jej celem jest Java 1.4. Guava została otwarta w 2007 roku, celuje w Javę 5, a zatem Guava znacznie korzysta z funkcji Java 5: generyki, varargs, enums i autoboxing.

Według twórców Guava, generyki są jednym z powodów, dla których zdecydowali się stworzyć nową bibliotekę zamiast ulepszać Apache Commons (zobacz Google-collections FAQ, pod tytułem "Dlaczego Google to wszystko zbudowało, skoro zamiast tego mogło próbować ulepszyć Kolekcje Apache Commons?").

Zgadzam się z nimi: chociaż często krytykowane (brak reifikacji, ograniczone ze względu na kompatybilność wsteczną), generyki Javy są nadal bardzo {31]} użyteczne, gdy są odpowiednio używane, tak jak Guava. Wolę zrezygnować, niż pracować ze zbiorami niepowiązanymi!

(zauważ, że Apache Commons 3.0, does target Java 1.5+)

Guawa jest bardzo dobrze zaprojektowana / udokumentowana

Kod jest pełen najlepszych praktyk i użytecznych wzorców, aby API było bardziej czytelne, wykrywalne, wydajne, bezpieczne, bezpieczne dla wątków...

Po przeczytaniu efektywnej Javy (zajebista książka BTW) widzę te wzorce wszędzie w kodzie:

  • metody fabryczne (np. ImmutableList.copyOf())
  • wzór budowniczego (ImmutableList.builder(), Joiner, CharMatcher, Splitter, Ordering, ...)
  • immutability (zbiory niezmienne, CharMatcher, Joiner, Splitter,...)
  • implementation hiding (Predicates.xXx, ...)
  • faworyzowanie kompozycji nad dziedziczeniem (zbiory ForwardXXX)
  • null-sprawdza
  • wzór enum-singleton
  • proxy serializacyjne
  • dobrze przemyślane konwencje nazewnictwa

Mógłbym godzinami wyjaśniać zalety tych wyborów projektowych(powiedz mi, jeśli chcesz). Chodzi o to, że te wzorce nie są tylko "na pokaz", mają realną wartość: API jest przyjemne w użyciu, łatwiejsze do nauczenia się (zapomniałem powiedzieć, jak dobrze udokumentowane?), bardziej wydajne, a wiele klas jest prostszych / bezpiecznych ze względu na ich niezmienność.

Jako bonus, można się wiele nauczyć patrząc na kod:)

Guawa jest spójna

Kevin Bourrillion (główny programista Guava) wykonuje świetną robotę, utrzymując wysoki poziom jakości / spójności w całej bibliotece. On oczywiście nie jest sam, a wielu wielkich programistów przyczyniło się do Guava (nawet Joshua Bloch , który teraz pracuje w Google!).

[11]}podstawowe filozofie i wybory projektowe za Guava są spójne w całej bibliotece, a deweloperzy stosują się do bardzo dobrych (IMO) zasad projektowania API, nauczywszy się na błędach z przeszłości interfejsów API JDK (Nie ich błędy {13]}). Guawa ma wysoki stosunek mocy do masy.]}

Projektanci Guava oprzyj się pokusie dodawania zbyt wielu funkcji, ograniczając API do najbardziej przydatnych. Wiedzą, że bardzo trudno jest usunąć funkcję po dodaniu, i postępuj zgodnie z mottem Joshuy Blocha na temat projektowania API: "gdy masz wątpliwości, zostaw to" {21]}. Ponadto, użycie adnotacji @ Beta pozwala im przetestować niektóre wybory projektowe bez angażowania się w określone API .

Wspomniane powyżej wybory projektowe pozwalają na bardzo kompaktowe API. Wystarczy spojrzeć na MapMaker , aby zobaczyć moc pakowane wewnątrz" prostego " budowniczego. Inne dobre (choć prostsze?) przykładami są CharMatcher, Splitter , oraz porządkowanie .

Bardzo łatwo jest również komponować różne części guawy. Na przykład, powiedzmy, że chcesz buforować wynik złożonej funkcji ? Feed tej funkcji do MapMaker i BINGO, masz wątek bezpieczny komputer map/cache. Trzeba ograniczyć wejścia map/funkcji do określonych ciągów? Nie ma problemu, zawiń go w środku ConstrainedMap, używając CharMatcher do odrzucania niewłaściwych łańcuchów...

Guawa jest w aktywnym rozwoju

Podczas gdy rozwój Apache Commons wydaje się przyspieszyć wraz z pracami nad Commons Lang 3.0, Guava wydaje się zbierać więcej pary w tej chwili, podczas gdy Google open sources więcej ich wewnętrznych klas.

Ponieważ Google mocno opiera się na nim wewnętrznie, nie sądzę, że wkrótce zniknie. Plus, open sourcing its biblioteka common libraries pozwala Google na łatwiejsze otwieranie innych bibliotek, które od niej zależą (zamiast przepakowywać je , tak jak obecnie robi to Guice ).

Podsumowanie

Z wszystkich powyższych powodów Guava jest moją biblioteką przy rozpoczynaniu nowego projektu. I jestem bardzo wdzięczny Google i niesamowite deweloperów Guava, którzy stworzyli tę fantastyczną bibliotekę.


PS: możesz też przeczytać ten drugi więc pytanie

PPS: nie posiadam (jeszcze) akcji Google

 220
Author: Etienne Neveu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 05:36:20

Używam guava od sierpnia 2010, począwszy od wydania r06. Zasadniczo miałem bibliotekę Javy greenfield do opracowania, więc rozejrzałem się za najlepszą biblioteką uzupełniającą dla API J2SE. Tradycyjnie korzystaliśmy z bibliotek Apache Commons, ale chciałem zobaczyć, co tam jest i zacząłem używać Guava.

Plusy

  1. konstrukcje języka Java 5.0. Biblioteka bierze większość swoich wskazówek projektowych z Blocha "Effective Java: 2nd Edition": niezmienność, builder pattern, fabryk zamiast konstruktorów, generyków itp. To sprawia, że kod jest ciaśniejszy i bardziej wyrazisty.
  2. obsługa programowania funkcyjnego, w szczególności z interfejsami funkcji najwyższego poziomu i predykatów.

Cons

  1. nie jest to wystarczający zamiennik dla Apache Commons, w szczególności commons-codec.
  2. Nie ma "guava cookbook". Biblioteka jest zarówno minimalistyczna, jak i ortogonalna. W ten sposób istnieje określona krzywa uczenia się, aby w pełni ją wykorzystać. Jak wspomniano, Javadoc jest doskonały, ale przydałyby się dłuższe studia przypadków kodu źródłowego. Jeśli znajdujesz się w środowisku wymagającym Javy 1.3 lub 1.4, masz pecha.

Dla mnie Guava sprawia, że Java czuje się bliżej zwięzłego, ekspresyjnego języka skryptowego, i to jest świetne.

 24
Author: miniharryc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-29 15:24:22

Z mojego doświadczenia nie widzę, że rywalizują ze sobą, lub że guava poprawia na Apache libs. Raczej guava uzupełnia libs Apaczów. Istnieją klasy i narzędzia w guava, które nie są w apache i vice versa.

Dlatego Nie wiem, czy trzeba przełączyć per se - powiedziałbym "użyj odpowiedniego narzędzia do właściwej pracy".

 16
Author: javamonkey79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-28 00:23:19