2010-11-30 8 views
11

संभव डुप्लिकेट:
Why does Guava's ImmutableList have so many overloaded of() methods?गुवा कक्षाएं केवल वैसे ही फैक्ट्री विधियों को प्रदान करती हैं जो varargs लेती हैं?

अमरूद के ImmutableList (और कुछ अन्य वर्ग) को देखते हुए, आप अतिभारित of सुविधा तरीकों के बहुत सारे मिल जाएगा ("युक्त एक अपरिवर्तनीय सूची रिटर्न दिया तत्व, क्रम में। ") जो पैरामीटर की एक अलग संख्या लेते हैं:

... 
public static <E> ImmutableList<E> of(E e1, E e2, E e3) 
public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4) 
public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5) 
... 

सभी तरह से इस एक के लिए:

public static <E> ImmutableList<E> of(E e1, 
             E e2, 
             E e3, 
             E e4, 
             E e5, 
             E e6, 
             E e7, 
             E e8, 
             E e9, 
             E e10, 
             E e11, 
             E e12, 
             E... others) 

मेरा कुछ सहयोगियों इस मूर्खतापूर्ण पर विचार, सोच क्यों नहीं है सिर्फ एक नहीं विधि है: of(E... elements)। उन्हें संदेह है कि यह एक खराब निर्देशित प्रदर्शन "अनुकूलन" है जो श्रेणी में पड़ता है "क्या आपको लगता है कि आप कंपाइलर से ज्यादा चालाक हैं", या ऐसा कुछ।

मेरा झुकाव केविन बोर्रियन एट अल है। इन तरीकों को वास्तविक कारण के लिए वहां रखें। क्या कोई भी कारण बता सकता है (या अनुमान लगा सकता है) क्या कारण हो सकता है?

+0

यदि लाइब्रेरी पुरानी थी तो मुझे संदेह होगा कि विधियों को पूर्व जावा 5.0 लिखा गया था। मूल कोड पुराना हो सकता है और इसे दोबारा नहीं किया गया है। –

+0

@ पीटर: इस तथ्य को कभी भी ध्यान न दें कि यह उन्हें हटाने के लिए पिछली संगतता को तोड़ देगा (कोड एक विधि के खिलाफ जुड़ा होगा जो अब मौजूद नहीं है), जिसे वे नहीं चाहते हैं। हालांकि उन्हें कम से कम बहिष्कृत किया जा सकता था। –

+0

@ मार्क, विडंबना यह है कि यह (ई []) निर्माता है जिसे बहिष्कृत किया गया है। ;) –

उत्तर

10

source में टिप्पणी कहते हैं:

// These go up to eleven. After that, you just get the varargs form, and 
// whatever warnings might come along with it. :(

तो, यह किया गया था क्योंकि varargs तरीकों सामान्य तर्क के साथ एक चेतावनी का उत्पादन।

0

यह सबसे आम उपयोग मामलों के लिए एक varargs सरणी बनाने के ऊपरी हिस्से से बचने के लिए है। EnumSet.of(..) के तरीके के बाद इसे मॉडलिंग किया गया था।

+3

मैं ऐसा नहीं कर सकता, क्योंकि ये विधियां आंतरिक रूप से समान वैरगा विधि को कॉल करती हैं। – axtavt

+0

प्रभावी जावा में इसके बारे में एक अध्याय बात कर रहा है, लेकिन मुझे लगता है कि यह इंटरनेट पर नहीं ढूंढ पा रहा है। –

3

मुझे लगता है कि unchecked generic array creation चेतावनी से बचने के लिए E एक सामान्य प्रकार है।

+1

मुझे यकीन नहीं है कि यह कारण था, लेकिन यह निश्चित रूप से एक प्रासंगिक विचार है। यह बेवकूफ है, लेकिन वर्तमान में जावा में आपको यह चेतावनी मिलती है जब आप * सामान्य प्रकार का उपयोग करते हुए एक varargs विधि को कॉल करते हैं, जो हास्यास्पद है क्योंकि कॉलर के रूप में आप varargs के माध्यम से विधि को आमंत्रित करके बनाए गए सरणी से कभी भी बातचीत नहीं कर सकते हैं। मेरा मानना ​​है कि या तो जावा 7 या 8 चेतावनी को विधि घोषणा के लिए स्थानांतरित करने के लिए एक बदलाव पेश करेगा। –

-1

वास्तव में संकलक वास्तव में गूंगा है, जेवीएम में अधिकांश स्मारक हैं, लेकिन यह अभी भी एक vararg के लिए सरणी बनाने की आवश्यकता को खत्म करने के लिए पर्याप्त स्मार्ट नहीं है।

चाहे सरणी को सहेजना वास्तव में लायक है, शायद लेखक ऐसा नहीं चाहते थे कि उपयोगकर्ता चिंता करें। यानी वह जान सकता है कि इससे कोई फर्क नहीं पड़ता है, लेकिन सभी उपयोगकर्ताओं को यह महसूस नहीं हो सकता कि यह 99% समय के बारे में चिंताजनक नहीं है।

जब यह था गूगल-संग्रह इस विवरण "मानक संग्रह प्रकार के उच्च प्रदर्शन अपरिवर्तनीय कार्यान्वयन, उदाहरण के ImmutableSet के लिए"

+2

वरग पैरामीटर _are_ arrays, तो निश्चित रूप से एक varargs तर्क के लिए एक सरणी बनाना संभव नहीं है। वैसे भी, 'अपरिवर्तनीय सूची' इन सभी ओवरलोड (एकल-तत्व सूची के अपवाद के साथ) के लिए आंतरिक रूप से varargs सरणी बनाती है। – ColinD

-1

क्या मैं के बारे में सोच सकते हैं संकलक द्वारा भ्रम से बचने के है का हिस्सा था।

अगर हम केवल था,

public static ImmutableList<E> of(E element); //Option 1 

और

public static ImmutableList<E> of(E... elements); //Option 2 

और अपने कोड में हम था

ImmutableList<String> list = ImmutableList.of("Value"); 

संकलक पता नहीं है कि क्या विकल्प 1 या विकल्प कॉल करने के लिए 2.

फिर एक वैध कारण होना चाहिए कि जोश ब्लोच, केविन बोरिलियन और उनकी टीम ने "हास्यास्पद" of(...) विधि रखने का विचार किया।

+0

कंपाइलर कॉल से मेल खाने वाली सबसे विशिष्ट विधि का उपयोग करेगा ... इस मामले में, विकल्प 1. – ColinD

+0

प्लस, यदि वह सब कुछ आवश्यक था, तो यह केवल 'ओवर (ई, ई, ई .. ।) '। – ColinD

संबंधित मुद्दे