अमरूद और अपाचे समकक्ष पुस्तकालयों के बीच बड़े सुधार क्या हैं?


123

हम वर्तमान में अपाचे संग्रह, स्ट्रिंग बर्तनों आदि का उपयोग करते हैं, मुझे यह तय करने की आवश्यकता है कि क्या हमें अपाचे नींव के कार्यान्वयन से स्विच करना चाहिए।

महत्वपूर्ण मानदंड डेवलपर्स के उपयोग में आसानी है। प्रदर्शन / स्मृति उपयोग अभी भी हमारे लिए एक महत्वपूर्ण मुद्दा नहीं है। विकास की गति इस बिंदु पर महत्वपूर्ण मानदंड है।

मैं इस बारे में राय की सराहना करूंगा कि अमरूद के साथ डेवलपर का जीवन कितना आसान हो गया।

जवाबों:


223

सबसे पहले, जैसा कि 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 स्टॉक नहीं है (अभी तक)


धन्यवाद! * ब्लशेस * मैंने सिर्फ अमरूद के बहुत सक्रिय विकास के बारे में बात करने के लिए अपना उत्तर संपादित किया, और जावा 1.5 विशेषताओं को बेहतर तरीके से विस्तार से बताया।
एटिएन नेव्यू

1
बस ध्यान दिया गया कि केविन बॉरिलिन ने इस वार्ता में अमरूद बनाम अपाचे कॉमन्स के बारे में बात की: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Etienne Neveu

एक नोट, अमरूद यह एपीआई बदल देता है और इसके पुराने तरीकों को बहुत बार चित्रित करता है, इसलिए इस पर निर्भरता होने से संस्करण लॉक-इन और अन्य तीसरे पक्ष के पुस्तकालयों के साथ असंगति जैसे मुद्दे पैदा हो सकते हैं जो अमरूद का उपयोग करते हैं।
आर्किमिडीज ट्रेजानो

24

मैं अगस्त 2010 से अमरूद का उपयोग कर रहा हूं, r06 रिलीज के साथ शुरू हुआ। मूल रूप से, मेरे पास विकसित करने के लिए एक ग्रीनफ़ील्ड जावा पुस्तकालय था, इसलिए मैंने J2SE एपीआई के लिए सर्वश्रेष्ठ सहायक पुस्तकालय के लिए चारों ओर देखा। परंपरागत रूप से, हमने Apache Commons पुस्तकालयों का उपयोग किया था, लेकिन मैं यह देखना चाहता था कि वहां क्या था और अमरूद का उपयोग करना शुरू किया।

पेशेवरों

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

विपक्ष

  1. यह विशेष रूप से कॉमन्स-कोडेक में अपाचे कॉमन्स के लिए पर्याप्त प्रतिस्थापन नहीं है।
  2. 'अमरूद रसोई की किताब' नहीं है। लाइब्रेरी न्यूनतम और ऑर्थोगोनल दोनों है। इस प्रकार, इसका पूरा लाभ उठाने के लिए एक निश्चित सीखने की अवस्था है। जैसा कि उल्लेख किया गया है, Javadoc उत्कृष्ट है, लेकिन कुछ लंबे स्रोत कोड केस अध्ययन उपयोगी होंगे।
  3. यदि आप जावा 1.3 या 1.4 की आवश्यकता वाले वातावरण में हैं, तो आप भाग्य से बाहर हैं।

मेरे लिए, अमरूद जावा को एक थकाऊ, अभिव्यंजक पटकथा भाषा के करीब महसूस करता है, और यह बहुत अच्छा है।


16

मेरे अनुभव में मुझे नहीं लगता कि वे एक दूसरे के साथ चुनाव लड़ते हैं, या वह अमरूद अपाचे कामों में सुधार करता है। बल्कि, अमरूद का पूरक अपाचे libs। अमरूद में कक्षाएं और उपयोगिताओं हैं जो अपाचे और इसके विपरीत में नहीं हैं।

इसलिए, मुझे नहीं पता है कि आपको प्रति से स्विच करने की आवश्यकता है - मैं कहूंगा कि "सही काम के लिए सही उपकरण का उपयोग करें"।


1
मैं इस नतीजे पर हाल ही में आया था, यह देखने के बाद कि अमरूद के पास भी कुछ नहीं था, जो अपाचे FileNameUtils में पेश करता है (हाँ वहाँ ओवरलैप है, लेकिन Apache की FileNameUtils में Guava की फ़ाइलें बहुत अधिक हैं। इसके अलावा, Google को Filesकभी भी उपयोग क्यों करना है ? अब मुझे कभी भी चाहिए) JDK का उपयोग करने के लिए Files, मुझे पूरा रास्ता लिखना होगा ...)। मेरे ऐप को फ़ाइल उपयोगिता की बहुत आवश्यकता थी, इसलिए मैं इस मामले में अपाचे का उपयोग करने से बच नहीं सकता था।
डॉन चेडल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.