सबसे पहले, जैसा कि javamonkey79 ने समझाया था, जबकि Google अमरूद और अपाचे कॉमन्स समान विशेषताओं को साझा करते हैं, उनके पास कार्यक्षमता भी है जो उनके समकक्ष से अनुपस्थित है। इस प्रकार, अपने आप को केवल एक पुस्तकालय तक सीमित करना नासमझी हो सकती है।
कहा जा रहा है, अगर मुझे चुनना था, तो मैं (दुर्लभ) मामलों के लिए अपाचे कॉमन्स को रखते हुए अमरूद का उपयोग करने का विकल्प चुनूंगा, जहां अमरूद की आवश्यक कार्यक्षमता नहीं है। मुझे समझाने की कोशिश क्यों करते हैं।
अमरूद अधिक "आधुनिक" है
अपाचे कॉमन्स वास्तव में एक परिपक्व पुस्तकालय है, लेकिन यह भी लगभग 10 साल पुराना है, और जावा 1.4 को लक्षित करता है। जावा 2007 में खुला था , जावा 5 को लक्षित किया गया था , और इस प्रकार जावा 5 सुविधाओं से बहुत लाभ होता है: जेनरिक , वेरगेज , एनम और ऑटोबॉक्सिंग ।
अमरूद डेवलपर्स के अनुसार, जेनेरिक एक कारण है कि उन्होंने अपाचे कॉमन्स को सुधारने के बजाय एक नई लाइब्रेरी बनाने का विकल्प चुना ( Google-Collection FAQ देखें , शीर्षक के तहत "Google ने यह सब क्यों बनाया, जब यह अपाचे को बेहतर बनाने की कोशिश कर सकता था।" इसके बजाय कॉमन्स कलेक्शंस? ” )।
मैं उनसे सहमत हूं: जबकि अक्सर आलोचना की जाती है (पिछड़े अनुकूलता के कारण सीमित नहीं है), जावा जेनरिक अभी भी बहुत उपयोगी है जब उचित रूप से उपयोग किया जाता है, जैसे कि अमरूद करता है। मैं गैर-संग्रहित संग्रह के साथ काम करने के बजाय छोड़ देता हूँ!
(ध्यान दें कि अपाचे कॉमन्स 3.0, जावा 1.5+ को लक्षित करता है )
अमरूद बहुत अच्छी तरह से डिजाइन / प्रलेखित है
कोड सर्वोत्तम प्रथाओं और उपयोगी पैटर्न से भरा है ताकि एपीआई को अधिक पठनीय, खोज योग्य, प्रदर्शनकारी, सुरक्षित, धागा-सुरक्षित बनाया जा सके ...
प्रभावी जावा (भयानक पुस्तक बीटीडब्ल्यू) को पढ़ने के बाद , मुझे कोड में हर जगह ये पैटर्न दिखाई देते हैं:
- कारखाने के तरीके (जैसे
ImmutableList.copyOf()
)
- बिल्डर पैटर्न (
ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...)
- अचल स्थिति (अपरिवर्तनीय संग्रह,
CharMatcher
, Joiner
, Splitter
, ...)
- कार्यान्वयन छिपाना (
Predicates.xXx
, ...)
- वंशानुक्रम (
ForwardXXX
संग्रह) पर अनुकूल रचना
- अशक्त-जांच करता है
- एनम-सिंगलटन पैटर्न
- क्रमबद्धता समीपता
- सुविचारित नामकरण परंपराएँ
मैं इन डिज़ाइन विकल्पों द्वारा लाए गए लाभों के बारे में बताने के लिए घंटों तक जा सकता हूं (मुझे बताएं कि क्या आप मुझे चाहते हैं)। बात यह है, ये पैटर्न न केवल "शो के लिए" हैं, उनके पास एक वास्तविक मूल्य है: एपीआई का उपयोग करने के लिए एक खुशी है, सीखना आसान है (क्या मैं यह कहना भूल गया कि यह कितना अच्छा दस्तावेज है?), अधिक कुशल, और। बहुत से वर्ग अपनी अपरिवर्तनीयता के कारण सरल / थ्रेड-सुरक्षित हैं।
एक बोनस बिंदु के रूप में, एक कोड को देखकर बहुत कुछ सीखता है :)
अमरूद संगत है
केविन Bourrillion (अमरूद के प्रमुख डेवलपर) पुस्तकालय में गुणवत्ता / स्थिरता के उच्च स्तर को बनाए रखने के लिए एक महान काम करता है। वह निश्चित रूप से अकेला नहीं है, और बहुत से महान डेवलपर्स ने अमरूद (यहां तक कि जोशुआ बलोच , जो अब Google पर काम करता है!) में योगदान दिया है ।
अमरूद के पीछे मुख्य दर्शन और डिजाइन के विकल्प पुस्तकालय भर में सुसंगत हैं, और डेवलपर्स JDK एपीआई ( अपनी गलतियों को नहीं , हालांकि) की पिछली गलतियों से सीखकर बहुत अच्छे (IMO) एपीआई डिजाइन सिद्धांतों का पालन करते हैं।
अमरूद में उच्च शक्ति-से-भार अनुपात है
अमरूद डिजाइनर बहुत अधिक सुविधाओं को जोड़ने के लिए प्रलोभन का विरोध करते हैं, एपीआई को सबसे उपयोगी तक सीमित करते हैं। वे जानते हैं कि एक बार जोड़ा गया एक फीचर को निकालना बहुत मुश्किल है, और एपीआई डिजाइन पर जोशुआ बलोच के आदर्श वाक्य का पालन करें : "जब संदेह हो, तो इसे छोड़ दें" । इसके अलावा, @Beta एनोटेशन का उपयोग करने से उन्हें एक विशिष्ट API के लिए प्रतिबद्ध किए बिना कुछ डिज़ाइन विकल्पों का परीक्षण करने की अनुमति मिलती है ।
ऊपर बताए गए डिज़ाइन विकल्प एक बहुत कॉम्पैक्ट एपीआई के लिए अनुमति देते हैं। बस "साधारण" बिल्डर के अंदर पैक की गई शक्ति को देखने के लिए मैपमेकर को देखें। अन्य अच्छे (यद्यपि सरल?) उदाहरण चारमैचर , स्प्लिटर और ऑर्डरिंग हैं ।
अमरूद के विभिन्न भागों की रचना करना भी बहुत आसान है। उदाहरण के लिए, मान लें कि आप किसी जटिल फ़ंक्शन का परिणाम कैश करना चाहते हैं ? इस फ़ंक्शन को अपने मैपमेकर और बिंगो को खिलाएं, आपको थ्रेड-सुरक्षित कंप्यूटिंग मैप / कैश मिला। विशिष्ट स्ट्रिंग्स के लिए मानचित्र / फ़ंक्शन इनपुट को बाधित करने की आवश्यकता है? कोई समस्या नहीं है, इसे अनुचित स्ट्रिंग्स को अस्वीकार करने के लिए एक CharMatcher का उपयोग करके, एक विवश मानचित्र के अंदर लपेटें ...
अमरूद सक्रिय विकास में है
जबकि Apache Commons का विकास Commons Lang 3.0 पर काम के साथ तेज हो गया है, Guava इस समय अधिक भाप उठा रहा है, जबकि Google अपने आंतरिक कक्षाओं के अधिक स्रोतों को खोलता है।
चूंकि Google आंतरिक रूप से इस पर बहुत निर्भर करता है, मुझे नहीं लगता कि यह जल्द ही किसी भी समय गायब होने वाला है। साथ ही, अपने आम पुस्तकालयों को खोलने के लिए Google अन्य स्रोतों को आसानी से खोलने के लिए अनुमति देता है जो इस पर निर्भर करते हैं (बजाय उन्हें दोहराते हुए, जैसे कि वर्तमान में गुइसे करता है )।
निष्कर्ष
उपरोक्त सभी कारणों से, अमरूद एक नया प्रोजेक्ट शुरू करने के लिए मेरी गो-टू लाइब्रेरी है। और मैं Google और भयानक अमरूद डेवलपर्स के लिए बहुत आभारी हूं, जिन्होंने इस शानदार पुस्तकालय का निर्माण किया।
पुनश्च: आप इस अन्य SO प्रश्न को पढ़ना चाहते हैं
PPS: मेरा कोई Google स्टॉक नहीं है (अभी तक)