Was sind die großen Verbesserungen zwischen Guava- und Apache-äquivalenten Bibliotheken?

123

Wir verwenden derzeit Apache-Sammlungen, String-Utils usw. Ich muss entscheiden, ob wir von der Implementierung der Apache-Grundlagen wechseln sollen.

Das wichtige Kriterium ist die Benutzerfreundlichkeit der Entwickler. Leistung / Speichernutzung ist für uns noch kein wichtiges Thema. Die Geschwindigkeit der Entwicklung ist an dieser Stelle das Hauptkriterium.

Ich würde mich über Meinungen darüber freuen, wie das Leben des Entwicklers mit Guave erheblich einfacher wurde.

Klopfen
quelle

Antworten:

223

Erstens, wie javamonkey79 erklärte, haben Google Guava und Apache Commons zwar ähnliche Funktionen, aber beide verfügen auch über Funktionen, die in ihrem Gegenstück nicht vorhanden sind. Daher ist es möglicherweise unklug, sich auf nur eine Bibliothek zu beschränken.

Wenn ich mich jedoch entscheiden müsste, würde ich mich für die Verwendung von Guava entscheiden und Apache Commons für die (seltenen) Fälle beibehalten, in denen Guava nicht über die erforderliche Funktionalität verfügt. Lassen Sie mich versuchen zu erklären, warum.

Guave ist "moderner"

Apache Commons ist eine sehr ausgereifte Bibliothek, aber auch fast 10 Jahre alt und zielt auf Java 1.4 ab. Guava war 2007 Open Source , zielt auf Java 5 ab und daher profitiert Guava stark von den Java 5-Funktionen: Generika , Varargs , Enums und Autoboxing .

Laut den Guava-Entwicklern sind Generika ein Grund, warum sie eine neue Bibliothek erstellt haben, anstatt Apache Commons zu verbessern (siehe die häufig gestellten Fragen zu Google-Sammlungen unter dem Titel "Warum hat Google all dies erstellt, als es versucht haben könnte, den Apache zu verbessern?" Commons-Sammlungen stattdessen? " ).

Ich stimme ihnen zu: Obwohl sie häufig kritisiert werden (keine Verdinglichung, aufgrund der Abwärtskompatibilität eingeschränkt), sind Java-Generika bei angemessener Verwendung immer noch sehr nützlich, wie dies bei Guava der Fall ist. Ich würde lieber aufhören als mit nicht generierten Sammlungen zu arbeiten!

(Beachten Sie, dass Apache Commons 3.0, tut Ziel Java 1.5+)

Guave ist sehr gut gestaltet / dokumentiert

Der Code ist voll von Best Practices und nützlichen Mustern, um die API lesbarer, erkennbarer, leistungsfähiger, sicherer, threadsicherer zu machen ...

Nachdem ich Effective Java (fantastisches Buch BTW) gelesen habe , sehe ich diese Muster überall im Code:

  • Fabrikmethoden (wie ImmutableList.copyOf())
  • Erbauer ( ImmutableList.builder(), Joiner, CharMatcher, Splitter, Ordering, ...)
  • Unveränderlichkeit (unveränderlich Sammlungen CharMatcher, Joiner, Splitter, ...)
  • Implementierung versteckt ( Predicates.xXx, ...)
  • Bevorzugung der Komposition gegenüber der Vererbung (die ForwardXXXSammlungen)
  • Null-Checks
  • Enum-Singleton-Muster
  • Serialisierungs-Proxys
  • gut durchdachte Namenskonventionen

Ich könnte stundenlang die Vorteile dieser Designentscheidungen erläutern (sagen Sie mir, ob Sie das möchten). Die Sache ist, diese Muster sind nicht nur "für die Show", sie haben einen echten Wert: Die API ist angenehm zu bedienen, einfacher zu erlernen (habe ich vergessen zu sagen, wie gut dokumentiert sie ist?), Effizienter und Viele Klassen sind aufgrund ihrer Unveränderlichkeit einfacher / threadsicher.

Als Bonuspunkt lernt man viel, wenn man sich den Code ansieht :)

Guave ist konsistent

Kevin Bourrillion (Guavas Hauptentwickler) leistet hervorragende Arbeit bei der Aufrechterhaltung eines hohen Qualitäts- / Konsistenzniveaus in der gesamten Bibliothek. Er ist natürlich nicht allein und viele großartige Entwickler haben zu Guava beigetragen (sogar Joshua Bloch , der jetzt bei Google arbeitet!).

Die Kernphilosophien und Entwurfsentscheidungen hinter Guava sind in der gesamten Bibliothek konsistent, und die Entwickler halten sich an sehr gute (IMO) API-Entwurfsprinzipien, da sie aus früheren Fehlern der JDK-APIs gelernt haben (jedoch nicht aus ihren Fehlern).

Guave hat ein hohes Leistungsgewicht

Die Guava-Designer widerstehen der Versuchung, zu viele Funktionen hinzuzufügen, und beschränken die API auf die nützlichsten. Sie wissen, dass es sehr schwierig ist, ein einmal hinzugefügtes Feature zu entfernen, und folgen dem Motto von Joshua Bloch zum API-Design: "Wenn Sie Zweifel haben, lassen Sie es weg" . Durch die Verwendung der Annotation @Beta können sie außerdem einige Entwurfsoptionen testen, ohne sich auf eine bestimmte API festlegen zu müssen .

Die oben genannten Entwurfsoptionen ermöglichen eine sehr kompakte API. Schauen Sie sich einfach den MapMaker an, um zu sehen, wie viel Leistung in einem "einfachen" Builder steckt . Andere gute (wenn auch einfachere?) Beispiele sind CharMatcher , Splitter und Ordering .

Es ist auch sehr einfach, verschiedene Teile von Guava zu komponieren. Angenommen, Sie möchten das Ergebnis einer komplexen Funktion zwischenspeichern ? Wenn Sie diese Funktion Ihrem MapMaker und BINGO zuführen, erhalten Sie eine thread-sichere Computer-Map / einen Thread-Cache. Müssen Sie die Map- / Funktionseingaben auf bestimmte Strings beschränken? Kein Problem, wickeln Sie es in eine ConstrainedMap ein und verwenden Sie einen CharMatcher , um unangemessene Strings abzulehnen ...

Guave ist in aktiver Entwicklung

Während sich die Entwicklung von Apache Commons mit der Arbeit an Commons Lang 3.0 beschleunigt zu haben scheint, scheint Guava im Moment mehr Dampf zu bekommen, während Google mehr interne Klassen von Open Source-Quellen nutzt.

Da Google intern stark darauf angewiesen ist, glaube ich nicht, dass es bald verschwinden wird. Durch Open Sourcing seiner gemeinsamen Bibliotheken kann Google außerdem andere davon abhängige Open Source- Bibliotheken einfacher öffnen (anstatt sie neu zu verpacken , wie dies derzeit bei Guice der Fall ist ).

Fazit

Aus all den oben genannten Gründen ist Guava meine Anlaufstelle, wenn ich ein neues Projekt starte. Und ich bin Google und den großartigen Guava-Entwicklern sehr dankbar, die diese fantastische Bibliothek erstellt haben.


PS: Vielleicht möchten Sie auch diese andere SO-Frage lesen

PPS: Ich besitze (noch) keine Google-Aktie.

Etienne Neveu
quelle
Vielen Dank! * errötet * Ich habe gerade meine Antwort bearbeitet, um mehr über die sehr aktive Entwicklung von Guava zu sprechen und die Java 1.5-Funktionen genauer zu beschreiben.
Etienne Neveu
1
Ich habe gerade bemerkt, dass Kevin Bourrillion in diesem Vortrag über Guava gegen Apache Commons spricht: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Etienne Neveu
Ein Hinweis: Guava ändert seine APIs und veraltet seine alten Methoden häufig, sodass Abhängigkeiten davon Probleme wie Versionssperren und Inkompatibilität mit anderen Bibliotheken von Drittanbietern verursachen können, die Guava verwenden.
Archimedes Trajano
24

Ich benutze Guave seit August 2010, beginnend mit der Version r06. Grundsätzlich musste ich eine Java-Bibliothek auf der grünen Wiese entwickeln, also suchte ich nach der besten Zusatzbibliothek für die J2SE-API. Traditionell hatten wir die Apache Commons-Bibliotheken verwendet, aber ich wollte sehen, was da draußen ist, und begann, Guava zu verwenden.

Vorteile

  1. Java 5.0-Sprachkonstrukte. Die Bibliothek orientiert sich größtenteils an Blochs "Effective Java: 2nd Edition": Unveränderlichkeit, Builder-Muster, Fabriken anstelle von Konstruktoren, Generika usw. Dadurch wird Ihr Code enger und ausdrucksvoller.
  2. Unterstützung der funktionalen Programmierung, insbesondere mit den Funktions- und Prädikatschnittstellen der obersten Ebene.

Nachteile

  1. Es ist kein ausreichender Ersatz für Apache Commons, insbesondere für Commons-Codec.
  2. Es gibt kein Guaven-Kochbuch. Die Bibliothek ist sowohl minimalistisch als auch orthogonal. Somit gibt es eine bestimmte Lernkurve, um sie voll auszunutzen. Wie bereits erwähnt, ist das Javadoc ausgezeichnet, aber einige längere Fallstudien zum Quellcode wären hilfreich.
  3. Wenn Sie sich in einer Umgebung befinden, in der Java 1.3 oder 1.4 erforderlich ist, haben Sie kein Glück.

Mit Guava fühlt sich Java für mich einer knappen, ausdrucksstarken Skriptsprache näher, und das ist großartig.

Miniharryc
quelle
16

Nach meiner Erfahrung nehme ich nicht wahr, dass sie miteinander streiten oder dass Guave die Apache-Bibliotheken verbessert. Guave ergänzt vielmehr die Apache-Bibliotheken. Es gibt Klassen und Dienstprogramme in Guave, die nicht in Apache sind und umgekehrt.

Daher weiß ich nicht, dass Sie per se wechseln müssen - ich würde sagen "Verwenden Sie das richtige Werkzeug für den richtigen Job".

javamonkey79
quelle
1
Ich bin kürzlich zu diesem Schluss gekommen, nachdem ich festgestellt hatte, dass Guava nicht einmal annähernd das bietet, was Apache in FileNameUtils bietet (ja, es gibt Überschneidungen, aber Apaches FileNameUtils hat viel mehr als Guavas Dateien. Warum musste Google jetzt verwenden Files? Jetzt, wann immer ich möchte Um das JDK nutzen zu können Files, muss ich den gesamten Pfad aufschreiben ...). Meine App benötigte viel Dateidienstprogramm, daher konnte ich die Verwendung von Apache in diesem Fall nicht vermeiden.
Don Cheadle