Guava ve apache eşdeğer kitaplıkları arasındaki büyük gelişmeler nelerdir?


123

Şu anda apache koleksiyonları, string utils, vb. Kullanıyoruz. Apache Foundations uygulamasından geçiş yapıp yapmamaya karar vermem gerekiyor.

Önemli kriter geliştiricilerin kullanım kolaylığıdır. Performans / bellek kullanımı bizim için henüz önemli bir konu değil. Geliştirme hızı bu noktada kilit kriterdir.

Guava ile geliştiricinin hayatının nasıl önemli ölçüde kolaylaştırıldığına dair görüşlerimi takdir ediyorum.

Yanıtlar:


223

Öncelikle, javamonkey79'un açıkladığı gibi, Google Guava ve Apache Commons benzer özellikleri paylaşırken, her ikisi de muadillerinde bulunmayan işlevselliğe sahiptir. Bu nedenle, kendinizi yalnızca bir kitaplıkla sınırlamak akıllıca olmayabilir.

Bununla birlikte, eğer seçim yapmak zorunda kalsaydım, Guava'yı kullanmayı tercih ederdim, Guava'nın gerekli işlevselliğe sahip olmadığı (nadir) durumlarda Apache Commons'ı etrafta tutardım. Nedenini açıklamaya çalışayım.

Guava daha "modern"

Apache Commons gerçekten olgun bir kitaplıktır, ancak aynı zamanda neredeyse 10 yıllıktır ve Java 1.4'ü hedeflemektedir. Guava 2007'de açık kaynaklıydı , Java 5'i hedefliyordu ve bu nedenle Guava Java 5 özelliklerinden büyük ölçüde yararlanıyor: jenerikler , vararglar , numaralandırma ve otomatik kutulama .

Guava geliştiricilerine göre jenerik bunun yerine Apache Commons iyileştirilmesi için yeni bir kütüphane oluşturmak için seçti nedenlerinden biri (bkz olan google-koleksiyonları SSS başlığı altında, "Google neden inşa Bütün bunları yapan, bu Apache geliştirmeye çalıştık ne zaman Bunun yerine Commons Collections? " ).

Onlara katılıyorum: sık sık eleştirilse de (hiçbir şey ifade etmiyor, geriye dönük uyumluluk nedeniyle sınırlı), Java jenerikleri, Guava'nın yaptığı gibi uygun şekilde kullanıldığında hala çok kullanışlıdır. Jenerik olmayan koleksiyonlarla çalışmaktansa işi bırakmayı tercih ederim!

(Not Apache Commons 3.0, yani yapar 1.5+ hedef Java)

Guava çok iyi tasarlanmış / belgelenmiştir

Kod, API'yi daha okunabilir, keşfedilebilir, performanslı, güvenli, iş parçacığı açısından güvenli hale getirmek için en iyi uygulamalar ve kullanışlı modellerle doludur ...

Etkili Java'yı (harika kitap BTW) okuduktan sonra, kodun her yerinde şu kalıpları görüyorum:

  • fabrika yöntemleri (gibi ImmutableList.copyOf())
  • oluşturucu deseni ( ImmutableList.builder(), Joiner, CharMatcher, Splitter, Ordering, ...)
  • değişmezlik (değişmez koleksiyonları, CharMatcher, Joiner, Splitter, ...)
  • uygulama gizleme ( Predicates.xXx, ...)
  • kompozisyonu mirasa tercih etme ( ForwardXXXkoleksiyonlar)
  • boş-çekler
  • enum-singleton desen
  • serileştirme proxy'leri
  • iyi düşünülmüş adlandırma kuralları

Bu tasarım seçeneklerinin getirdiği avantajları açıklamak için saatlerce devam edebilirim (eğer istersen söyle). Mesele şu ki, bu modeller yalnızca "gösteri için" değil, gerçek bir değere sahipler: API'yi kullanmak bir zevk, öğrenmesi daha kolay (ne kadar iyi belgelendiğini söylemeyi unuttum mu?), Daha verimli ve birçok sınıf, değişmezlikleri nedeniyle daha basit / iş parçacığı açısından güvenlidir.

Bonus puan olarak, koda bakarak çok şey öğrenilir :)

Guava tutarlıdır

Kevin Bourrillion (Guava'nın baş geliştiricisi), kitaplıkta yüksek düzeyde kalite / tutarlılık sağlayarak harika bir iş çıkarıyor. Elbette yalnız değil ve birçok harika geliştirici Guava'ya katkıda bulundu ( şu anda Google'da çalışan Joshua Bloch bile !).

Guava'nın arkasındaki temel felsefeler ve tasarım seçimleri, kitaplıkta tutarlıdır ve geliştiriciler, JDK API'lerinin geçmiş hatalarından ders alarak ( yine de hatalarından değil) çok iyi (IMO) API tasarım ilkelerine bağlı kalırlar .

Guava yüksek bir güç-ağırlık oranına sahiptir

Guava tasarımcıları, API'yi en kullanışlı olanlarla sınırlayarak çok fazla özellik eklemenin cazibesine direniyor. Eklenen bir özelliği kaldırmanın çok zor olduğunu biliyorlar ve Joshua Bloch'un API tasarımıyla ilgili sloganını takip ediyorlar : "Şüpheye düştüğünde, onu atla" . Ayrıca, @Beta açıklamasını kullanmak, belirli bir API taahhüt etmeden bazı tasarım seçeneklerini test etmelerine olanak tanır .

Yukarıda bahsedilen tasarım seçenekleri çok kompakt bir API'ye izin verir. "Basit" bir oluşturucu içinde paketlenmiş gücü görmek için Harita Oluşturucusuna bakın. Diğer iyi (daha basit de olsa?) Örnekler CharMatcher , Splitter ve Ordering'dir .

Guava'nın çeşitli kısımlarını oluşturmak da çok kolay. Örneğin, karmaşık bir sonucunu önbelleğe almak istediğini söylüyorsun fonksiyonu ? Bu işlevi MapMaker ve BINGO'nuza besleyin, iş parçacığı açısından güvenli bir bilgi işlem haritası / önbelleğiniz var. Harita / işlev girdilerini belirli Dizelerle sınırlamanız mı gerekiyor? Sorun değil, uygun olmayan Dizeleri reddetmek için bir CharMatcher kullanarak bir ConstrainedMap içine sarın ...

Guava aktif geliştirme aşamasında

Apache Commons'ın gelişimi, Commons Lang 3.0 üzerindeki çalışmayla hızlanmış gibi görünse de, Guava şu anda daha fazla güç toplarken, Google kendi iç sınıflarının çoğunu kaynakları açıyor gibi görünüyor.

Google dahili olarak buna büyük ölçüde güvendiğinden, yakın zamanda ortadan kalkacağını düşünmüyorum. Ayrıca, ortak kitaplıklarının açık kaynak kullanımı, Google'ın ona bağlı olan diğer kitaplıkları daha kolay bir şekilde açmasına olanak tanır ( Guice'nin şu anda yaptığı gibi, onları yeniden paketlemek yerine ).

Sonuç

Yukarıdaki tüm nedenlerden ötürü, Guava, yeni bir projeye başlarken kitaplığımdır. Ve bu harika kitaplığı oluşturan Google'a ve harika Guava geliştiricilerine çok müteşekkirim.


Not: Bu diğer SO sorusunu da okumak isteyebilirsiniz

PPS: Herhangi bir Google hissem yok (henüz)


Teşekkürler! * kızardı * Cevabımı Guava'nın çok aktif gelişimi hakkında daha fazla konuşmak ve Java 1.5 özelliklerini daha iyi detaylandırmak için düzenledim.
Etienne Neveu

1
Kevin Bourrillion'un bu konuşmada Guava ile Apache Commons'tan bahsettiğini fark ettim: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Etienne Neveu

Bir not, Guava, API'lerini değiştirir ve eski yöntemlerini sık sık kullanımdan kaldırır, bu nedenle bağımlılıklara sahip olmak, Guava kullanan diğer üçüncü taraf kitaplıkları ile sürüm kilitlenmesi ve uyumsuzluk gibi sorunlara neden olabilir.
Archimedes Trajano

24

R06 sürümünden başlayarak Ağustos 2010'dan beri guava kullanıyorum. Temel olarak, geliştirmem gereken sıfırdan bir java kitaplığım vardı, bu yüzden J2SE API için en iyi yardımcı kitaplığı araştırdım. Geleneksel olarak Apache Commons kitaplıklarını kullanırdık, ama orada ne olduğunu görmek istedim ve Guava'yı kullanmaya başladım.

Artıları

  1. Java 5.0 dil yapıları. Kütüphane, tasarım ipuçlarının çoğunu Bloch'un "Etkili Java: 2. Baskı" dan alır: Değişmezlik, oluşturucu modeli, kurucular yerine fabrikalar, Jenerikler, vb. Bu, kodunuzu daha sıkı ve daha anlamlı kılar.
  2. Özellikle üst düzey Function ve Predicate arayüzleriyle fonksiyonel programlama desteği.

Eksileri

  1. Apache Commons için, özellikle ortak kodek için yeterli bir ikame değildir.
  2. Bir 'guava yemek kitabı' yok. Kütüphane hem minimalist hem de ortogonaldir. Bu nedenle, ondan tam olarak yararlanmak için kesin bir öğrenme eğrisi vardır. Bahsedildiği gibi, Javadoc mükemmeldir, ancak bazı daha uzun kaynak kodu vaka çalışmaları yardımcı olacaktır.
  3. Java 1.3 veya 1.4 gerektiren bir ortamdaysanız, şansınız kalmaz.

Bana göre Guava, Java'yı kısa ve anlamlı bir betik diline daha yakın hissettiriyor ve bu harika.


16

Tecrübelerime göre, onların birbirleriyle rekabet ettiklerini veya guava'nın apaçi libleri üzerinde geliştiğini algılamıyorum. Guava , apaçi kitaplarını tamamlar . Guava'da apache'de olmayan sınıflar ve yardımcı programlar vardır ve bunun tersi de geçerlidir.

Bu nedenle, kendi başınıza geçiş yapmanız gerektiğini bilmiyorum - "doğru iş için doğru aleti kullanın" derdim.


1
Bu sonuca yakın zamanda, Guava'nın FileNameUtils'te Apache'nin sunduklarına yakın bir şey olmadığını gördükten sonra geldim (evet örtüşme var, ancak Apache'nin FileNameUtils'sinde Guava's Files'dan çok daha fazlası var. Ayrıca, Google neden kullanmak zorunda kaldı Files? Şimdi istediğim zaman JDK'yı kullanmak için Filestüm yolu yazmam gerekiyor ...). Uygulamamın çok sayıda Dosya yardımcı programına ihtiyacı vardı, bu yüzden bu durumda Apache'yi kullanmaktan kaçınamadım.
Don Cheadle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.