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
ForwardXXX
Sammlungen)
- 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.