java - मरज - जावा 9 में संग्रह के लिए ओवरलोडेड सुविधा फैक्टरी तरीके का बिंदु क्या है




इश्क में मरजावा (4)

आप इसे दूसरी तरफ देख सकते हैं। चूंकि varargs विधियां सरणी स्वीकार कर सकती हैं, इस तरह की एक विधि एक सरणी को List बदलने के वैकल्पिक तरीकों के रूप में कार्य करेगी।

String []strArr = new String[]{"1","2"};
List<String> list = List.of(strArr);

इस दृष्टिकोण का विकल्प Arrays.asList का उपयोग Arrays.asList लेकिन इस मामले में List में किए गए कोई भी बदलाव उस सरणी में प्रतिबिंबित होंगे जो List.of साथ नहीं है। इसलिए जब आप List और सरणी को सिंक में नहीं चाहते हैं तो आप List.of उपयोग कर सकते हैं।

नोट spec में दिया गया औचित्य मेरे लिए एक माइक्रो-ऑप्टिज़ेशन की तरह लगता है। (अब यह एपीआई के मालिक द्वारा another जवाबों में टिप्पणी में पुष्टि की गई है)

जावा 9 अपरिवर्तनीय सूचियां बनाने के लिए सुविधा फैक्ट्री विधियों के साथ आता है। अंत में एक सूची निर्माण उतना आसान है जितना:

List<String> list = List.of("foo", "bar");

लेकिन इस विधि के 12 अधिभारित संस्करण हैं, 11 से 0 तत्वों के साथ 11, और एक var args के साथ।

static <E> List<E>  of(E... elements)

Set और Map साथ ही मामला है।

चूंकि एक var args विधि है, अतिरिक्त 11 विधियों का क्या मतलब है?

मुझे लगता है कि var-args एक सरणी बनाते हैं, इसलिए अन्य 11 विधियां एक अतिरिक्त वस्तु के निर्माण को छोड़ सकती हैं और ज्यादातर मामलों में 0 - 10 तत्व करेंगे। क्या इसके लिए कोई अन्य कारण है?


आपको जोश ब्लोच के प्रभावी जावा (द्वितीय संस्करण) के आइटम 42 का निम्नलिखित मार्ग मिल सकता है:

एक varargs विधि के प्रत्येक आमंत्रण एक सरणी आवंटन और प्रारंभिक कारण बनता है। यदि आपने अनुभवपूर्वक निर्धारित किया है कि आप इस लागत का जोखिम नहीं उठा सकते हैं लेकिन आपको varargs की लचीलापन की आवश्यकता है, तो एक ऐसा पैटर्न है जो आपको अपना केक लेने और इसे खाने देता है। मान लीजिए कि आपने यह निर्धारित किया है कि किसी विधि के 95 प्रतिशत कॉल में तीन या कम पैरामीटर हैं। फिर विधि के पांच अधिभारों की घोषणा करें, एक प्रत्येक के साथ तीन सामान्य पैरामीटर के माध्यम से शून्य, और तर्कों की संख्या तीन से अधिक होने पर उपयोग के लिए एक var varss विधि [...]


जैसा कि आपको संदेह है, यह एक प्रदर्शन वृद्धि है। Vararg विधियां "हुड के नीचे" एक सरणी बनाती हैं, और जिस विधि को 1-10 तर्क लेते हैं, वह इस अनावश्यक सरणी निर्माण से सीधे बचाता है।


जेईपी दस्तावेज़ों से ही -

विवरण -

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

संपादित करें - प्रेरणा जोड़ने के लिए और @CKing द्वारा टिप्पणियों में पहले ही उल्लेख किया गया है:

गैर-लक्ष्य -

यह तत्वों की मनमानी संख्याओं के साथ उच्च प्रदर्शन, स्केलेबल संग्रह का समर्थन करने का लक्ष्य नहीं है। फोकस छोटे संग्रह पर है

प्रेरणा -

एक छोटा, अपरिवर्तनीय संग्रह (कहना, एक सेट) बनाना, इसे बनाने, इसे स्थानीय चर में संग्रहीत करना, और इसमें कई बार add () का आविष्कार करना और फिर इसे लपेटना शामिल है।

Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

जावा 8 स्ट्रीम एपीआई का उपयोग स्ट्रीम फैक्ट्री विधियों और कलेक्टरों के संयोजन से छोटे संग्रहों के निर्माण के लिए किया जा सकता है।

// Java 8
Set<String> set1 = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(Collectors.toSet()));

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

// Java 9 
Set set2 = Set.of("a", "b", "c");




java-9