Google अमरूद बनाम अपाचे कॉमन्स [बंद]


212

मैं जावा में एक द्विदिश मानचित्र कार्यान्वयन की तलाश में था, और इन दो पुस्तकालयों पर ठोकर खाई:

दोनों स्वतंत्र हैं, द्विदिश मानचित्र कार्यान्वयन है जिसे मैं (Apache में BiiMap, Google में BiMap) खोज रहा था, आश्चर्यजनक रूप से लगभग एक ही आकार के हैं (Apache 493 kB, Google 499 kB) [ed: no true true!] और लगता है! सभी तरह से मेरे लिए बहुत समान है।

मुझे कौन सा चुनना चाहिए और क्यों? क्या कुछ अन्य समान विकल्प हैं (स्वतंत्र होना चाहिए और कम से कम द्विदिश नक्शा होना चाहिए)? मैं नवीनतम जावा एसई के साथ काम कर रहा हूं, इसलिए कृत्रिम रूप से जावा 5 या उस जैसे कुछ भी सीमित करने की कोई आवश्यकता नहीं है।


5
निश्चित रूप से आपको हमें पुस्तकालय चुनने का मापदंड देना चाहिए? लाइसेंस, प्रदर्शन, अतिरिक्त निर्भरता, जेनेरिक का समर्थन, ...
स्टीव

1
Google संग्रह repo1.maven.org: repo1.maven.org/maven2/com/google/collections/…
Joachim Sauer

मैं सही हूं - मैं कॉम / googlecode
kdgregory

जवाबों:


185

मेरी राय में बेहतर विकल्प अमरूद (जिसे पहले Google संग्रह के रूप में जाना जाता था):

  • यह अधिक आधुनिक है (जेनरिक है)
  • यह पूरी तरह से संग्रह एपीआई आवश्यकताओं का अनुसरण करता है
  • यह सक्रिय रूप से बनाए रखा है
  • CacheBuilderऔर यह पूर्ववर्ती MapMakerसिर्फ सादा भयानक है

अपाचे कॉमन्स कलेक्शंस एक अच्छी लाइब्रेरी के रूप में अच्छी तरह से है, लेकिन यह एक जेनरिक-सक्षम संस्करण (जो मेरी राय में एक संग्रह एपीआई के लिए एक बड़ी कमी है) प्रदान करने में लंबे समय से विफल रहा है और आम तौर पर एक रखरखाव में लगता है / नहीं-नहीं यह बहुत काम-पर-यह मोड हाल ही में कॉमन्स कलेक्शंस ने कुछ स्टीम को फिर से उठाया है, लेकिन इसमें कुछ कैच अप करने के लिए है।

यदि डाउनलोड आकार / मेमोरी फुटप्रिंट / कोड आकार एक मुद्दा है तो Apache Commons Collection एक बेहतर उम्मीदवार हो सकता है, क्योंकि यह अन्य पुस्तकालयों की एक सामान्य निर्भरता है। इसलिए इसे अपने स्वयं के कोड में उपयोग करने के साथ-साथ किसी भी अतिरिक्त निर्भरता को जोड़े बिना संभावित रूप से किया जा सकता है। संपादित करें: यह विशेष रूप से "लाभ" अब तक आंशिक रूप से विकृत हो गया है, क्योंकि कई नए पुस्तकालय वास्तव में अमरूद पर निर्भर करते हैं और अपाचे कॉमन्स संग्रह पर नहीं


3
मैं वास्तव में आश्चर्यचकित हूं: अन्य राय क्यों नहीं हैं? क्या मुझे शैतानों के वकील की भूमिका निभानी चाहिए? अपाचे कॉमन्स कलेक्शंस एक बुरी लाइब्रेरी नहीं है, आखिर।
जोआचिम सॉर

10
चूंकि अपाचे में जेनरिक का अभाव है, मुझे लगता है कि यह स्पष्ट है कि इन दोनों में से कौन सा भविष्य है। Google अगला तार्किक कदम है। हालांकि, यह एक अजीब लग रहा है, कि यह विशालकाय द्वारा बनाया गया है ... लेकिन जब तक यह एक नि: शुल्क लाइसेंस के तहत है, भले ही यह Microsoft द्वारा बनाया गया हो, इससे कोई फर्क नहीं पड़ता। मेरा अनुमान।
जूनस पुलकका

12
पाठकों को पता होना चाहिए कि यह एक बहुत पुराना उत्तर है और बहुत कुछ बदल गया है
रॉय ट्रूवेलोव

1
@RoyTruelove यह मुझे आश्चर्यचकित नहीं करता है कि बहुत कुछ बदल गया है और मैं इस मामले पर आपके वर्तमान विचारों को सुनना पसंद करूंगा, या शायद अधिक हालिया समीक्षा / तुलना के लिए एक लिंक। मुझे "डिफ़ॉल्ट रूप से अपरिवर्तनीय / केवल यदि आवश्यक हो तो दर्शन" और अमरूद में जेनेरिक को शामिल करना पसंद है, लेकिन मैं जो सामग्री पढ़ रहा हूं वह सभी दिनांकित हो सकती है जैसे आप कहते हैं कि यह धागा बन गया है।
जेओए

2
@ testerjoe2 - क्षमा करें, मैंने लिखा है कि एक लंबी टिप्पणी करें और स्पष्ट रूप से इसका कारण याद नहीं है। दृष्टिहीनता में यह एक बहुत ही बेकार था! मुझे महसूस नहीं हुआ कि 2010 के बाद से लिबास में बदलाव नहीं हुआ है, लेकिन मुझे पता है कि उनका भारी इस्तेमाल जारी है, और इसलिए मैं कहूंगा कि सुरक्षित होना चाहिए। अगर मैं w / एक नई परियोजना शुरू कर रहा था, तो आज मैं शायद गोल्डमैन सैक के कलेक्शन लिब: github.com/goldmansachs/gs-collections पर करीब से नजर डालूंगा । जब आप दुनिया की सबसे बुरी कंपनियों में से एक हों, तो आपको वास्तव में यह सुनिश्चित करना चाहिए कि आपको एक किकवास जावा संग्रह पुस्तकालय मिल गया है।
रॉय ट्रुवेलोव

72

Faq से: Google संग्रह FAQ

Google ने यह सब क्यों बनाया, जब वह अपाचे कॉमन्स कलेक्शंस को बेहतर बनाने की कोशिश कर सकता था?

अपाचे कॉमन्स कलेक्शंस बहुत स्पष्ट रूप से हमारी जरूरतों को पूरा नहीं करते थे। यह जेनेरिक का उपयोग नहीं करता है, जो हमारे लिए एक समस्या है क्योंकि हम अपने कोड से संकलन चेतावनी प्राप्त करने से नफरत करते हैं। यह लंबे समय तक "धारण पैटर्न" में भी रहा है। हम देख सकते हैं कि इसे ठीक करने के लिए हमें उससे एक बहुत बड़े निवेश की आवश्यकता होगी जब तक कि हम इसका उपयोग करने में खुश न हों, और इस बीच, हमारी अपनी लाइब्रेरी पहले से ही व्यवस्थित रूप से बढ़ रही थी।

अपाचे पुस्तकालय और हमारे बीच एक महत्वपूर्ण अंतर यह है कि हमारे संग्रह जेडडीके इंटरफेस द्वारा लागू किए गए अनुबंधों का बहुत ईमानदारी से पालन करते हैं। यदि आप अपाचे प्रलेखन की समीक्षा करते हैं, तो आपको उल्लंघन के अनगिनत उदाहरण मिलेंगे। वे इतने स्पष्ट रूप से इंगित करने के लिए श्रेय के हकदार हैं, लेकिन फिर भी, मानक संग्रह व्यवहार से भटकना जोखिम भरा है! आपको सावधान रहना चाहिए कि आप इस तरह के संग्रह के साथ क्या करते हैं; कीड़े हमेशा बस होने की प्रतीक्षा कर रहे हैं।

हमारे संग्रह पूरी तरह से उत्पन्न होते हैं और कभी भी अपने अनुबंधों का उल्लंघन नहीं करते हैं (अलग-थलग अपवादों के साथ, जहां जेडीके कार्यान्वयनों ने स्वीकार्य उल्लंघनों के लिए एक मजबूत मिसाल कायम की है)। इसका मतलब है कि आप हमारे संग्रह में से किसी भी विधि को पारित कर सकते हैं जो एक संग्रह की अपेक्षा करता है और बहुत आश्वस्त महसूस करता है कि चीजें ठीक उसी तरह काम करेंगी जैसी उन्हें चाहिए।


71

मैंने जो सबसे महत्वपूर्ण चीजें पाई हैं, वे Google संग्रह को शुरू करने के लिए जगह बनाती हैं:

  • जेनरिक (जेनरिक के बिना संग्रह - एफटीएल)
  • संग्रह ढांचे के साथ संगति (जोश बलोच इस ढांचे में एक प्रमुख खिलाड़ी थे)
  • शुद्धता। ये लोग इस समस्या को ठीक करने के लिए पूरी तरह से बाध्य हैं; उनके पास 25K यूनिट परीक्षण जैसा कुछ है, और एपीआई को सही प्राप्त करने के लिए बंधे हैं।

यहाँ एक महान Youtube वीडियो है जो प्राथमिक लेखक द्वारा दिया गया था और वह इस पुस्तकालय के बारे में जानने के लायक है पर चर्चा करने का एक अच्छा काम करता है।


7
वीडियो लिंक के लिए +1
जेस्पर

1
Google संग्रह के बारे में आगे पढ़ना: javalobby.org/articles/google-collections (इसके मुख्य रचनाकारों के साथ एक साक्षात्कार)। प्रश्न के लिए देखें "आपके दृष्टिकोण के बारे में क्या अद्वितीय है? यह उदाहरण के लिए, अपाचे कॉमन्स संग्रह के लिए कैसे भिन्न होता है?"
जोनिक

4
अपाचे कॉमन्स कलेक्शन वर्जन 4 में जेनेरिक का उपयोग किया गया है। commons.apache.org/proper/commons-collections/release_4_0.html
अब्दुल

-7

दो अन्य चीजें (मुझे आशा है कि मैं गलत नहीं हूं)

  • अमरूद का लाइसेंस (गूगल संग्रह का नया नाम) अपाचे लाइसेंस 2.0 है, जिसका अर्थ है: अपाचे कॉमन्स प्रोजेक्ट के लिए एक ही
  • मुझे अमरूद का स्रोत कोड एक फ़ाइल में डाउनलोड करने के लिए नहीं मिल रहा है (ऐसा लगता है कि केवल git-access संभव है)

19
सूत्रों का कहना है? आप मतलब जार जो ग्रहण में संलग्न किया जा सकता है? यह यहाँ है । BTW: क्या गलत है git clone https://code.google.com/p/guava-libraries/और के साथ git checkout v11.0.2?
Xaerxess

-7

अमरूद के बारे में एक बुरा बात यह है कि Multimap java.util.Map का विस्तार नहीं करता है। यदि आपके पास अपने स्वयं के तरीके हैं जो मैप्स पर काम करते हैं तो वे अमरूद मल्टीपैप्स पर काम नहीं करेंगे (Apache MultiMap इंटरफ़ेस java.util.Map का विस्तार करता है)। मुझे यकीन है कि वहाँ कुछ अच्छा कारण है क्यों यह जिस तरह से है, लेकिन यह भी असुविधाजनक है।


16
यदि आप उपयोग करना चाहते Multimapहैं Map, तो हमेशा asMap()देखें।
Xaerxess

22
आप java.util.Map को लागू करने के लिए एक मल्टीमैप की अपेक्षा कैसे करते हैं? एक बहु-नक्शा एक नक्शे से मौलिक रूप से अलग है।
तिलके

1
Multimap <K, V> मानचित्र <K, संग्रह <V >> .. का विस्तार करता है, मुझे संदेह है कि G का अच्छा कारण था कि वे मानचित्र को सुपरनोटफेस के रूप में उपयोग नहीं करते थे।
मैट

10
@lucek: यदि आप जावदोक के माध्यम से देखते हैं Map, तो इस समझ के साथ कि हर संदर्भ Vवास्तव में एक होगा Collection<V>, मुझे लगता है कि आप बहुत जल्दी देखेंगे कि यह एक अच्छा सुपरनोटफेस क्यों नहीं है Multimap<K, V>
बर्बाद करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.